2011-06-22 6 views
3

Je travaille sur un démon Perl pour Linux et voici son squelette:Démarrage et arrêt Daemon Perl sous Linux

#!/usr/bin/env perl 
use File::Copy; 
use Socket; 
use Sys::Hostname; 
use POSIX qw(setsid); 
use Env; 

use Sys::Info::Constants qw(:device_cpu); 

my $daemonName = 'proc'; 

my $proc; 
my $error; 
my $file = "Proc.pl"; 
my $pidfile = ">/var/run/proc.pid"; 
my $pid2check = "/var/run/proc.pid"; 
my $pid; 


if (!$error) { 
    LogMessage("$daemonName : PID $proc : Begin"); 
} 

if (!$error) { 
    LogMessage("$daemonName : PID $proc : Writing pid information to $pidfile"); 
    print FILE $proc . "\n"; 
    close (FILE); 
} 

$SLEEP_TIME = 5; # seconds 

#Main loop of Daemon 
while (!$error) { 
    sleep($SLEEP_TIME); 

} 


if ($error) { 
    LogMessage("$file : PID $proc : Error $error"); 
} 

LogMessage("$file : PID $proc : END"); 

exit(0); 


sub Daemonize { 

if (!(chdir '/')) { 
    $error .= "Can't chdir to /: $!"; 
} 
if (!(umask 0)) { 
    $error .= "Unable to umask 0"; 
} 

unless (open STDIN, '/dev/null') { 
    $error .= "Can't read /dev/null: $!"; 
} 

open(OLD_OUT,">&STDOUT"); 

#All print statments will now be sent to our log file 
unless (open STDOUT, '>>/var/log/proc.log') { 
    $error .= "Can't read /var/log/proc.log: $!"; 
} 
#All error messages will now be sent to our log file 
unless (open STDERR, '>>/var/log/proc.log') { 
    $error .= "Can't write to /var/log/proc.log: $!"; 
} 

defined($pid = fork); 
#Exit if $pid exists (parent) 

if ($pid) 
{ 
    print OLD_OUT "Service successfully installed.\n"; 
    exit(0); 
} 

#As Child 
setsid(); 
$proc = $$; 
return ($proc); 
} 


#Prints log messages 
sub LogMessage { 
my $message = $_[0]; 
print localtime() . " $message\n"; 
} 

Je suis relativement nouveau à Perl, et je me demandais quelle serait la moyen le plus simple de démarrer et d'arrêter ce démon? Aussi comment vérifier pour m'assurer qu'il n'y a pas une instance déjà exécutée?

Répondre

5

De manière générale, la démonétisation est effectuée avec la méthode double fork. C'est un idiome courant et il y a libraries qui fait cela pour vous et que vous devriez envisager d'utiliser. Un fichier pid ou lockfile est souvent utilisé pour s'assurer qu'une seule instance s'exécute à la fois. Si vous envisagez d'utiliser ceci comme un processus système, il est également possible d'utiliser quelque chose comme upstart ou supervisord pour faire la gestion des processus et "un seul à la fois" chose pour vous.

Questions connexes