まず、9 行目で割り当てを終了するためにセミコロンが必要です。
$SIG{TERM} = sub { $continue = 0 ; };
私がそれを追加するまで、あなたのプログラムは実行さえしなかったので、スクリプトにそれがあり、ここで見逃していたと思います.
それを超えて、私は Guss が正しいと思います、そしてあなたにはパーミッションの問題があります。確認方法はこちら。別のターミナルを開いて実行しますtop
。デーモン スクリプトを開始すると、Perl プロセスが表示されます。問題が権限にある場合は、Perl プロセスがすぐに消えます。スクリプトはサブルーチンで終了しますが、その時点でデーモンが端末にアクセスできないため、役立つエラー メッセージが表示されません。
このテストを変更する簡単な方法die
はwarn
、サブルーチンで変更することです。これを行うと、デーモンは永久に実行され続けます (top
これを確認するには、実行中のターミナルをチェックしてください)。ただし、問題がアクセス許可にある場合でも、ファイルが作成されたり書き込まれたりすることはありません。
編集:はい、権限の問題+ STDERRへのアクセスなし=デッド、サイレントデーモン。このバージョンを試してください。ただし、STDERR 用に切り替えたログに書き込めることを確認してください。
Proc::Daemon::Init();
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 ; };
while ( $continue ) {
sleep(5);
greeting();
}
sub greeting {
open STDERR, '>>', '/Users/telemachus/log'
or die "Can't reopen STDERR to log: $!";
open my $fh, '>>', '/usr/local/foo'
or warn "Can't open /usr/local/foo for writing: $!";
print $fh "hello word\n";
close $fh;
}
ログにこれがたくさん表示される可能性があります。
書き込み用に foo を開けません: デーモン ライン 21 で権限が拒否されました。デーモン ライン 22 で閉じられたファイルハンドル $fh に対する print()。