我使用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;
}
答案 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(' /')
中有一个额外的空格。