2010-10-28 99 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

相關問題