2015-03-03 40 views
1

我正在嘗試捕獲一段時間的日誌,解析它並生成報告。這是我做的捕獲一段時間的日誌

(tail -F log_file | grep --line-buffered some_text | awk '{process lines} END {produce report}') & pid=$! && disown 
sleep 60 
pkill -TERM -P $pid 
kill -TERM $pid 

說明:

  1. tail日誌文件和管道grepawk處理,並在END生產報告。在一個命令組中運行這些(內()
  2. 等待60秒
  3. 殺死進程羣的兒童(tailgrepawk
  4. 殺死命令組

現在問題當awk死亡時,它不會寫報告(完成END部分)!我在這裏做錯了什麼?你能提出一種解決方法嗎?

回答

2

您已經解釋了您的問題。 「Awk被殺時,不會寫報告。」

正確的解決方案是隻殺死tail,然後等待管道的其餘部分完成。

如果您tail支持--pid=說法,這很簡單 - 只是在後臺啓動定點sleep過程,運行,只要你需要,殺哨兵,等待tail退出。或者使用您已經使用的sleep 60;只需在tail管道之前啓動它。

sleep 60 & 
zzz=$! 
tail -F log_file --pid=$zzz | awk '/some_text/ {process lines} END {produce report}' 
wait $zzz 

(注也重構失去毫無用處grep | awk。)

如果沒有,事情容易得到更多的參與。我可以想象,通過在子shell中設置一個巧妙的trap可能是可能的,但是我可能只是簡單地編寫一個簡短的Python或Perl封裝,並帶有一個信號處理程序在終止時寫入報告。

+0

'tail --pid'是這裏的關鍵。不知道這個選項 – ubi 2015-03-03 05:21:33