2012-12-02 25 views
0

後,我正在寫一些的監控程序像這樣的:如何重新啓動一個進程它死了

tail -f /var/log/router-home.log | while read line ; do 
    echo "$line" | egrep "MTF_SIP" | cut -b 28- | sed -u 's/#012/\n/g' \ 
    | egrep "IPP-->Received Event|rvCCConnMdmNewDigitCB|rvCCCallHandleOutOfBandDTMF" \ 
    | cut -d " " -f 15 
done > /tmp/phone/status & 

但每次logrotation走來它改變了/var/log/router-home.log殺有一個以上的這個例程過程 我不能檢查它的狀態只是做一個ps -e|grep tail

如何監視此例程,並在它死亡時重新啓動它?

回答

6

如果要按照文件而不是描述符(所以你得到最新的文件,即使像logrotate移動它,你在下面),您可以使用tail -F這基本上是:

tail --follow=name --retry 

我通常做的是運行:

tail -F somefile 2>/dev/null 

所以我沒有看到文件更改時的錯誤消息。您可以通過確保somefile不存在然後運行該命令來嘗試此操作。然後,從另一個會話:

echo pax is a >somefile 
rm somefile 
echo wonderful person >somefile 

並且您會看到這兩行顯示在tail輸出中。

使用該解決方案,進程不應該死亡,因此不需要重新啓動它。

+0

謝謝!這可以解決問題 –

+0

@KasperJanMooijman - 不要忘記點擊最佳答案旁邊的複選標記。 – ghoti

+0

感謝您通知我,我必須習慣這個網站 –

1

我建議你把腳本變成系統守護進程(例如,here是一個提示如何在Debian下執行此操作),還可以獲得良好的日誌記錄和對進程的控制。

你也可以簡單地trap所需的信號(SIGHUP也許?),而不是退出,重新打開日誌文件(重新啓動您的過程)。

trap ". /path/to/my-script.sh" SIGHUP 

其中/path/to/my-script.sh是具有給定代碼的文件。

相關問題