This takes care of all basic daemonization. It uses an optional argument for STDOUT and STDERR, or /dev/null otherwise. Emancipates your process from it's shell. Behaves as a good citizen. requires POSIX. Mostly cut/paste from the manual pages.
sub daemonize {
require POSIX;
my $logfile = shift;
$logfile = '/dev/null' unless defined $logfile;
chdir '/' or die "Can't chdir to /: $!";
open STDIN, '/dev/null' or die "failed opening STDIN: $!";
open STDOUT, ">>$logfile" or die "failed opening logfile $logfile:
+ $!";
{
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
}
POSIX::setsid() or die "Can't start a new session: $!";
open STDERR, '>&STDOUT' or die "Can't dup STDOUT for STDERR: $!";
return 1;
}