Acme-Spork
view release on metacpan or search on metacpan
lib/Acme/Spork.pm view on Meta::CPAN
if(spork(\&foo)) {
print "I am spork here me spoon\n";
}
else {
print "Could not fork for spork: $!";
}
my $spork_pid = spork(\&foo) or die "Could not fork for for spork: $!";
=head2 %reopen_stdfhs_to
You can now have spork reopen one or more of STDIN, STDOUT, STDERR.
You define how this is handled in the Acme::Spork hash '%reopen_stdfhs_to'
The key is the STD* handle (any other values are simply ignored).
The value is an array reference of arguments to open().
Its always a good idea to local()ize it as well (and specify all 3 handles, otherwise you may get some strange warnings and behavior):
local %Acme::Spork::reopen_stdfhs_to = (
STDIN => [qw(< /dev/null)],
STDOUT => [qw(> /dev/null)],
STDERR => [qw(> &STDOUT)],
);
spork(...)
or you can have it set to the value above globally like so:
use Acme::Spork qw(-reopen_stdfhs);
...
spork(...)
=head2 setsid()
Say you have a custom module that is a subset of POSIX functions that includes setsid() and you'd rather use that one instead of bringing in all of POSIX.
Just define Acme::Spork::setsid ()
sub Acme::Spork::setsid {
require POSIX::Subset;
POSIX::Subset::setsid();
}
my $pid = spork(...);
or if you already have the module loaded:
*Acme::Spork::setsid = *POSIX::Subset::setsid;
my $pid = spork(...);
It will use your setsid() instead and POSIX will not be brought in. If it doesn't actually setsid() then you just broke yourself so don't do that.
=head1 daemonize()
Since many daemons need to spork a child process when a request is received I've included a cheat function to daemonize your script execution.
Its simply a wrapper for Proc::Daemon::Init.
use Acme::Spork qw(daemonize);
# make sure we are the only one running:
use Unix::Pid '/var/run/this.pid';
# if so make me a daemon:
daemonize();
# and redo the pid_file with the new pid
Unix::PID->new()->pid_file('/var/run/this.pid')
or die 'The PID in /var/run/this.pid is still running.';
# and handle requests as a server:
while(<$incoming_requests>) {
my $req_pid = spork(\&handle_request($_));
if($req_pid) {
spork(\&log_request($_), $req_pid)
or warn "Could not spork log request $req_pid: $!";
}
else {
warn "Could not spork request: $!";
}
}
=head1 daemonize_without_close_on()
Same as daemonize() except it doesn't get Proc::Daemon::Init()'s POSIX::close done.
Useful if that happening causes you problems (which it has me...)
=head1 CAVEAT
If you set $SIG{CHLD} to 'IGNORE' all your $?'s will be -1 (i.e not what you might be expecting)
=head1 EXPORT
spork() is by default, daemonize() and daemonize_without_close_on() can be.
=head1 SEE ALSO
L<Proc::Daemon> is not used unless you call daemonize().
L<Unix::PID> is not used at all in this module except the daemonize() example. I figured if you were using this module you many be interested in it as well :)
=head1 ATTN modules@perl.org
I'd love to have this registered if you could find it in your heart :)
L<http://www.xray.mpe.mpg.de/mailing-lists/modules/2005-12/msg00154.html>
=head1 AUTHOR
Daniel Muey, L<http://drmuey.com/cpan_contact.pl>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2006 by Daniel Muey
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.
=cut
( run in 1.064 second using v1.01-cache-2.11-cpan-df04353d9ac )