1

我使用 daemonize 创建了一个守护进程,然后在名为 log 的文件中写入了一些内容,但是当我运行它时,它不起作用。

为什么我不能写入日志?

use POSIX;

sub daemonize{
    chdir '/';
    umask 0;
    open STDIN,'/dev/null'   || die "can not open /dev/null:$!";
    open STDOUT,'>/dev/null' || die "can not open /dev/null:$!";
    open STDERR,'>/dev/null' ||die "can not open /dev/null:$!";
    defined ($pid=fork) || die "can not fork a process:$!";
    exit if $pid;
    setsid || die "can not create session:$!";
}

&daemonize;
open LOG,">>/dev02/ycq/test/log" ||die "can not open file:$!";
my $num=0;
while(1){
    print LOG "$num\n";
    sleep 1;
}
4

3 回答 3

4

使用open(或任何其他函数或子程序)时,您需要考虑运算符优先级。在您的情况下,||运算符的优先级高于,(逗号)运算符。

您的线条如下所示:

open LOG, "file.txt" ||die "can not open file:$!";

实际上是这个意思,当考虑到优先级时:

open LOG, ("file.txt || die ...);

由于"file.txt"是一个真实的陈述,它永远不会触发该die陈述。

您需要的是:

open(LOG, "file.txt") || die ...

或者

open LOG, "file.txt" or die ...

在第一种情况下,括号覆盖运算符优先级,在第二种情况下,or运算符的优先级低于逗号运算符。

这一切意味着您的open呼叫可能默默地失败了。

于 2012-09-11T13:31:50.183 回答
3

你到底得到了什么错误?您可能正在遭受缓冲

您应该使用 open 的 3 参数形式。

chdir不会把你放在你想的地方;你用前导空格写了'/'。

你可能会发现Proc::Daemon也很有用。

于 2012-09-11T13:32:51.667 回答
0

也许是因为chdir(' /').

于 2012-09-11T13:32:46.067 回答