From d8967d91bf7d6e7f227f7bd585c64bcda0555f2b Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 29 Dec 2010 20:21:36 -0500 Subject: [PATCH] Double-fork for proper daemonization. --- IcculusNews_daemon.pl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/IcculusNews_daemon.pl b/IcculusNews_daemon.pl index fddb816..d59f026 100755 --- a/IcculusNews_daemon.pl +++ b/IcculusNews_daemon.pl @@ -33,7 +33,7 @@ use HTML::Entities; # Version of IcculusNews. Change this if you are forking the code. -my $version = "2.0.3"; +my $version = "2.0.4"; # Global rights constants. @@ -1627,13 +1627,18 @@ sub syslog_and_die { sub go_to_background { use POSIX 'setsid'; - chdir('/') or syslog_and_die("Can't chdir to '/': $!"); open STDIN,'/dev/null' or syslog_and_die("Can't read '/dev/null': $!"); open STDOUT,'>/dev/null' or syslog_and_die("Can't write '/dev/null': $!"); - defined(my $pid=fork()) or syslog_and_die("Can't fork: $!"); + # fork once, so launching process regains control. + defined(my $pid=fork) or syslog_and_die("Can't fork: $!"); exit if $pid; + # become session group leader, so we have no controlling terminal. setsid or syslog_and_die("Can't start new session: $!"); + # fork again; group leader (and chance of controlling terminal) vanishes. + defined($pid=fork) or syslog_and_die("Can't fork: $!"); + exit if $pid; open STDERR,'>&STDOUT' or syslog_and_die("Can't duplicate stdout: $!"); + chdir('/') or syslog_and_die("Can't chdir to '/': $!"); do_log(syslogDaemon, "Daemon process is now detached"); }