我在使用之前编写了一些测试代码Proc::Daemon
,我的测试代码如下:
#! /usr/bin/perl
use strict;
use warnings;
use Proc::Daemon;
Proc::Daemon::Init();
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 ; }
while ( $continue ) {
sleep(5) ;
&greeting ;
}
sub greeting {
open ( FH, ">>/home/daogu/foo" ) or die "can't open it" ;
print FH "hello word\n" ;
close FH ;
}
Run Code Online (Sandbox Code Playgroud)
在我启动玩具守护进程后,我发现实际上没有写入" foo
".任何人都可以解释为什么会这样?谢谢.
首先,您需要使用分号来终止第9行的赋值:
$SIG{TERM} = sub { $continue = 0 ; };
Run Code Online (Sandbox Code Playgroud)
直到我添加它,你的程序甚至不会运行,所以我猜你在脚本中有这个并且错过了它.
除此之外,我怀疑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;
}
Run Code Online (Sandbox Code Playgroud)
您可能会在日志中看到很多这样的内容:
无法打开foo进行写入:守护程序第21行的权限被拒绝.在守护程序第22行的关闭文件句柄$ fh上打印().