メメメモモ

プログラミング、筋トレ、ゲーム、etc

デーモン化する

スクリプトをデーモン化するには、スクリプト内で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) { }