2016-06-22 3 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)として返されます。 $タイムアウト値(例では10秒)を減算するbash $ []操作を使用
  • 何も出力が上記findから返されない場合、そのファイルが10秒以上変化しませんでした。これにより、ifの条件で真が起動され、killallコマンドが実行されます。

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

    をそして、あなただけのコマンドkill_application

    を発行することにより、いつでも自動的にせずにアプリケーションを再起動する場合は、それを使用します。

はまた、使用して、そのためのalias設定することができます人間が介入する場合は、crontabのエントリを毎分実行するようにインストールし、killallの後にapplication restartコマンドを発行することもできます(おそらく、アプリケーションの場合にのみ-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. 
関連する問題