2010-09-10 58 views
0

我正在編寫一個腳本,用於偵聽對日誌文件的更改並採取適當的行動。目前我正在使用open my $fh, "tail -f $logfile |";,但理想情況下我不想使用系統調用。在Perl中是否有等效的`tail -f`?

我試圖File::Tail,但它有1秒的最小間隔(我試圖傳遞較少,但它默認爲1秒,即使我通過0)。我已經檢查了它的源代碼,它似乎使用了sleep(),它採用了一個整數。在我嘗試寫我自己的之前,有沒有其他的選擇?

謝謝。

+0

它使用'Time :: HiRes :: sleep',所以它取小數。 – 2010-09-10 00:40:30

+0

似乎默認爲1,只要我下面,雖然我不得不承認我沒有計時。 – 2010-09-10 01:07:01

回答

6
  1. 你知道,tail -f也默認使用1秒的睡眠?這是真的! (至少對於GNU尾巴...)
  2. File::Tail實際使用Time::HiRessleep函數,這意味着睡眠時間參數不是的整數;您可以將其設置爲系統可以處理的任意秒數。
0

在我看來,使用tail -f管道沒有問題,就像你已經做的那樣。在許多情況下,像「無系統調用」這樣的語言純度會適得其反。

另外,我在長時間運行的流程中看到File::Tail的問題。不幸的是,我不能用任何確鑿的證據來證實這一說法,因爲它發生在一段時間以前,我沒有調試這些問題,取而代之的是將File::Tail替換爲tail -F

3

在文檔中有很多好東西,包括對這個確切問題的回答。從的perlfaq5答案How do I do a "tail -f" in perl?


首先嚐試

seek(GWFILE, 0, 1); 

聲明尋求(GWFILE,0,1)不改變當前的位置,但它確實清除端OF-文件條件,以便下一步使Perl再次嘗試讀取某些內容。

如果不工作(它依賴於你的stdio實現的功能),那麼你需要更多的東西是這樣的:

for (;;) { 
    for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) { 
    # search for some stuff and put it into files 
    } 
    # sleep for a while 
    seek(GWFILE, $curpos, 0); # seek to where we had been 
} 

如果這仍然不起作用,考慮從的clearerr方法IO :: Handle,它重置句柄上的錯誤和文件結束狀態。

還有一個來自CPAN的File :: Tail模塊。