为什么我的perl守护进程不打印?

Iaa*_*aan 3 perl daemon

我正在调试一个守护进程,我正在尝试使用print语句将信息输出到终端.我的代码的要点是:

#!/usr/bin/env perl

use strict;
use warnings;

use Readonly;

Readonly my $TIMEOUT => ...;

...

while (1) {

   print "DEBUG INFO";

   ...

   sleep $TIMEOUT;
}
Run Code Online (Sandbox Code Playgroud)

但是,没有输出它打印到我的终端.为什么是这样?

Hay*_*den 7

摘要:

使用$| = 1或添加换行符"\n"到打印件.

说明:

这不是打印到终端的原因是因为perl正在缓冲输出以提高效率.打印缓冲区填满后,将刷新,输出将显示在终端中.您可能需要强制冲洗缓冲区,因为$TIMEOUT您可能需要等待相当长的时间才能输出!

刷新缓冲区有两种主要方法:

1)当您打印到终端时,最有可能是文件句柄STDOUT.默认情况下,连接到终端的任何文件句柄都是行缓冲模式,我们可以通过在print语句中添加换行符来刷新缓冲区并强制输出:

while (1) {
    print "DEBUG INFO\n";
    ...
    sleep $TIMEOUT;
 }
Run Code Online (Sandbox Code Playgroud)

2)第二种方法是使用$|当设置为非零时使当前文件句柄(STDOUT默认情况下或最后select编辑)变为并立即强制刷新缓冲区.因此,以下还将强制打印调试信息:

$| = 1;
while (1) {
    print "DEBUG INFO";
    ...
    sleep $TIMEOUT;
}
Run Code Online (Sandbox Code Playgroud)

如果使用这样的语法令人困惑,那么您可能会考虑:

use IO::Handle;
STDOUT->autoflush(1);

while (1) {
    print "DEBUG INFO";
    ...
    sleep $TIMEOUT;
}
Run Code Online (Sandbox Code Playgroud)

在需要立即刷新缓冲区的许多代码示例中,您可能会看到$|++用于使文件句柄处于热状态并立即刷新缓冲区,--$|并使文件句柄处于冷态并关闭自动刷新.有关详细信息,请参阅这两个答案:

如果您有兴趣了解有关perl缓冲区的更多信息,那么我建议您阅读" 缓冲遭受缓冲",这可以深入了解我们为什么要缓冲并解释如何打开和关闭它.