Perl守护进程不兼容睡眠()

时间:2011-06-22 15:42:34

标签: perl daemon

我使用Proc::Daemon 编写了一个简单的测试守护进程。这是守护进程:

 #!/usr/bin/perl

 use Proc::Daemon;

 $daemon = Proc::Daemon->new(
        work_dir     => '/scripts/',
        child_STDOUT => '/scripts/child.log',
        child_STDERR => '+>>debugchild.txt',
        pid_file     => 'pid.txt',
        exec_command => 'perl /scripts/test.pl'
    );


foreach(@ARGV)
{
if ( /install/i )
{
    $Kid_1_PID = $daemon->Init;
}
elsif (/remove/i)
{
    $stopped = $daemon->Kill_Daemon();
}
}

这是测试它执行:

#!/usr/local/bin/perl

while (1) {

print "test\n";
sleep(1);
}

while循环适用于print语句,但是当我添加sleep()时;日志是空的。为什么会这样?

3 个答案:

答案 0 :(得分:5)

Perl不会自动刷新缓冲区,因此只有在很长一段时间后才能写入文件。当您没有睡眠时,由于正在写入的数据量,您的缓冲区几乎会自动刷新。

试试这个:

$| = 1;
while (1) {
    print "test\n";
    sleep(1);
}

答案 1 :(得分:4)

输出缓冲并没有足够的耐心?如果循环中有sleep(1),则可能需要一段时间才能累积足够的数据并将其刷新到日志文件中。

在脚本的顶部放置一个$|=1;语句。

答案 2 :(得分:0)

您还可以使用:

在控制台上刷新打印内容

select()->flush();

使用文件句柄$ FH刷新到文件

$FH->autoflush;