当我用perl创建一个守护进程并向文件写入内容时,它会失败

时间:2012-09-11 12:58:44

标签: perl

我使用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;
}

3 个答案:

答案 0 :(得分:4)

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

你的行看起来像这样:

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 ...

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

这一切意味着您的open电话可能会无声地失败。

答案 1 :(得分:3)

你得到的错误究竟是什么?你可能是suffering from buffering

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

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

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

答案 2 :(得分:0)

也许是因为chdir(' /')中有一个额外的空格。