首先,您需要一个分号来终止第 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()。