2011-06-22 7 views
3

でPerlのデーモンの起動と停止:私はLinux用のperlのデーモンに取り組んでおり、ここでそのスケルトンでてきた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"; 
} 

私はperlのために比較的新しいですし、私がどうなるか疑問に思いましたこのデーモンを開始および停止する最も簡単な方法は?また、すでに実行中のインスタンスがないことを確認するにはどうすればよいですか?

答えて

5

一般に、daemonisationはdouble forkメソッドで行われます。これは一般的なイディオムであり、使用することを検討する必要があるlibrariesがあります。 pidまたはlockfileは、一度に1つのインスタンスしか実行されないようにするためによく使用されます。

これをシステムプロセスとして使用する予定の場合は、upstartまたはsupervisordのようなものを使用してプロセス管理を行い、「ただ一度だけ」を行うこともできます。

関連する問題