2016-06-22 59 views
2

我已經編寫了一個程序,假設它運行了很長時間,它將輸出進度到stdout,但是,在某些情況下,它開始掛起,最簡單的做法是重新啓動它。如何殺死一段時間無輸出的進程

我的問題是:有沒有辦法做一些事情,只有在特定秒數內沒有輸出的情況下才會終止進程?

我已經開始考慮這個問題,而想到的唯一的事情是這樣的:

./application > output.log & 
tail -f output.log 

然後創建腳本將看看最後修改的日期和時間output.log並重新啓動整個東西。

但它看起來非常乏味,如果現在有一個命令,我會討厭所有這些。

回答

2

據我所知,目前還沒有一個標準的工具來做到這一點,但一個良好的開端,一個班輪將是:

timeout=10; if [ -z "`find output.log -newermt @$[$(date +%s)-${timeout}]`" ]; then killall -TERM application; fi 

至少,這將避免繁瑣的一部分編寫更復雜的腳本。

一些提示:

  • 使用find工具進行比較的時間基準的output.log文件的最後修改日期。
  • 自從EPOCH(1970-01-01 UTC)以來,時間參考由date實用程序返回爲當前時間(秒)(+%s)。
  • 使用bash $ []操作減去$超時值(10秒的示例)
  • 如果沒有輸出從上述find返回,則該文件沒有改變爲10秒以上。這將在if條件中觸發true,並且將執行killall命令。

您還可以設置爲一個alias,使用:

alias kill_application='timeout=10; if [ -z "`find output.log -newermt @$[$(date +%s)-${timeout}]`" ]; then killall -TERM application; fi'; 

,然後使用它,每當你想通過剛纔發出命令kill_application

如果你想自動重新啓動應用程序,而不人爲干預,您可以安裝一個crontab條目,每分鐘左右運行一次,並在killall之後發出應用程序重新啓動命令(可能您還可能需要將-TERM更改爲-KILL,以防萬一應用程序離子對可處理信號無響應)。

2

inotifywait可以在這裏幫助,它有效地等待文件的更改。可以檢查退出狀態以確定事件(modify)是否在指定的時間間隔內發生。

$ inotifywait -e modify -t 10 output.log 
Setting up watches. 
Watches established. 
$ echo $? 
2 

從人的一些相關信息:

OPTIONS 
    -e <event>, --event <event> 
     Listen for specific event(s) only. 

    -t <seconds>, --timeout <seconds> 
     Exit if an appropriate event has not occurred within <seconds> seconds. 

EXIT STATUS 
    2 The -t option was used and an event did not occur in the specified interval of time. 

EVENTS 
    modify A watched file or a file within a watched directory was written to.