2010-10-28 69 views
4

我正在运行一个全天候运行的脚本。它只是反复循环,很简单:Perl:运行“守护程序”并打印

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

我试着动睡眠命令到循环的结束,没没有什么不同。虽然这看起来很小,但它实际上是我一直在处理的一个问题,它会解决一些问题来解决它。我很接近地使用反引号来运行命令并捕获输出,然后打印输出,但是这导致了相同的行为。

回答

9

可能输出到LOG正在缓冲。尝试

select LOG; 
$| = 1; 
select STDOUT; 
LOG

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

被初始化。

+0

那(IO :: Handle选项)做到了!非常感谢你。 – Justin 2010-10-28 20:17:52

+0

@Justin:如果确实如此,请接受答案 – sebthebert 2010-10-28 23:39:59

相关问题