2013-10-06 72 views
0

我有一個Perlscript,做一些日誌文件的解析和執行,有時bash命令:Perl腳本日誌到文件,輸出滯後

$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"\`; 

我開始喜歡這個./perlscript.pl > logfile.log perl腳本。

現在我做了尾巴上的日誌文件看進步,但輸出卡在我上述的行每次。 輸出將在那裏停止幾秒鐘,然後繼續。 ???

要分析的問題,我把它包這樣的:

print `date`; 
$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"`; 
print `date`; 

輸出顯示該命令不消耗大量的時間:如果我運行腳本,而不重定向

So 6. Okt 22:35:04 CEST 2013 
So 6. Okt 22:35:04 CEST 2013 

輸出到文件沒有LAG。

任何想法爲什麼?

+0

1)編程的問題是題外話這裏,你可以發佈到[蘇],或在普通的* nix的腳本語言如Perl的情況下,[unix.se 2)[從不解析'LS的輸出'](http://mywiki.wooledge.org/ParsingLs)。 – terdon

回答

2

我沒有試圖複製你的行爲,但也可能是一個標準輸出緩衝問題。試着用:

$| = 1; 
$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"`; 

更新

試圖複製你觀察到的行爲:我不得不作出一些假設,但我相信我的懷疑是正確的。在這裏我管,但它一樣重定向到一個文件和拖尾該文件:

./test.pl | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }' 

沒有$| = 1,緩衝輸出,並彙總:

2013-10-06 23:08:27 Saluton, mondo: /home/lserni/test.sh 
2013-10-06 23:08:27 
2013-10-06 23:08:27 Waiting 10s... 
2013-10-06 23:08:27 Saluton denove! 

有了修改,每行印刷,因爲它是產生:

2013-10-06 23:09:09 Saluton, mondo: /home/lserni/test.sh 
2013-10-06 23:09:09 
2013-10-06 23:09:09 Waiting 10s... 
2013-10-06 23:09:19 Saluton denove! 

我期待你的腳本是做東西需要一些秒,一d是生成messagePath;並且輸出將被延遲,直到Perl有大量的數據要發送,給人的印象是這條線是停滯不前的。

我忘了:定時管來自here

+0

感謝您的回答,這確實是一個緩衝問題。 – cgross

0

在像你這樣的情況,我已經使用unbuffer命令一些成功。它在環境中運行一個命令,看起來像命令輸出到一個tty,所以它不會緩衝它的輸出。我不知道如何將它應用到你的案例中,所以如果你想嘗試它,你將不得不做一點實驗。

相關問題