スクリプトをデーモン化するには、スクリプト内でforkし、
親プロセスを終了して子プロセスを走らせます。
コードは下記のようになります。
「モダンperl入門」のコードをまんま引用させていただいてます。
use strict; use POSIX (); my $pid = fork(); if (! defined $pid) { die "Failed to fork(): $!"; } if ($pid) { # 親プロセス exit 0; } else { POSIX::setsid() || die "Could not detach from parent process"; } # 子プロセスのコード
親プロセスが終了して、つられて子プロセスが終了しないように、
POSIX::setsid()を用いてプロセスグループリーダーを変更しています。
App::Daemon
forkを直接書くのは、危険だということで、「App::Daemon」モジュールを使用します。
App::Daemonを用いるとログファイルやpidファイルを出力してくれます。
use strict; use warnings; use App::Daemon qw ( daemonize ); $App::Daemon::pidfile = "pp.pid"; # pidファイル。デフォルトは「/tmp/スクリプトファイル名.pid」 $App::Daemon::logfile = "mylog.log"; # logファイル。 daemonize(); while (1) { }