【问题标题】:Perl: Running a "Daemon" and printingPerl:运行“守护程序”并打印
【发布时间】:2010-10-28 19:57:04
【问题描述】:

我正在运行一个 24/7 全天候运行的脚本。它只是一遍又一遍地循环,非常简单:

while ($daemon) {
    sleep 60; 
    chomp(my $currentDate = `date +%c`);
    print LOG "-- Running trigger: $currentDate --\n";
        system("$triggerCmd >> $daemonLog");
        print LOG "-- Completed trigger test. --\n\n";
}

它工作正常。问题是它直到 60 秒睡眠后才打印最后一行(“完成触发测试”)。它打印运行行,运行命令,打印命令输出,然后等待 60 秒,然后打印“完成”并立即再次打印“运行”行。

所以它下面的过程是这样的:
睡眠 60 秒
打印“运行触发器”
运行触发器,重定向输出
睡眠 60 秒
打印完成
打印运行
运行触发器

但我希望它这样做:
睡觉 60
打印“运行触发器”
运行触发器,重定向输出
打印“完成”
睡觉 60

我尝试将 sleep 命令移到循环末尾,但没有任何区别。虽然这看起来很小,但它实际上是我已经处理了一段时间的问题,它可以解决一些问题来解决它。我最近使用反引号来运行命令并捕获输出,然后打印输出,但这导致了相同的行为。

【问题讨论】:

    标签: perl loops


    【解决方案1】:

    可能正在缓冲LOG 的输出。试试

    select LOG;
    $| = 1;
    select STDOUT;
    

    use IO::Handle;
    (*LOG)->autoflush(1);
    

    LOG 初始化后。

    【讨论】:

    • 那个(IO::Handle 选项)做到了!非常感谢。