2012-09-04 6 views
13

いくつかのファイルが変更されたときに、プロセスを再起動するための簡単な解決策(一般的なシェルユーティリティ、ほとんどのディストリビューションで提供されるutil経由、または単純なpython/...スクリプト)はありますか?Linuxでのファイル変更プロセスを再開する

sthをwatch -cmd "./the_process -arg" deps/*のように呼び出すといいでしょう。

更新:提案のinotify-ツールと一緒に 簡単なシェルスクリプト(!素敵な)私のニーズに合う(コマンドW/O引数のために働く):

#!/bin/sh 
while true; do 
    [email protected] & 
    PID=$! 
    inotifywait $1 
    kill $PID 
done 
+0

誰でも "$!"どうかしてください(Googleで見つけられませんでした)、ありがとうございます。 – Lior

+1

以前に起動したプロセスのIDを返す – Christian

+1

ファイルシステムに 'noatime'属性がない場合、' target'スクリプト/プロセスは 'access'イベントのため無限ループで再起動されます。これを修正するには、代わりに 'inotifywait -e modify $ 1'を使用してください。これはファイル修正イベントにのみ反応します。 – chronos

答えて

11

はい、あなたが見ることができますディレクトリまたはinotifywatchinotify-toolsからinotifyシステムを経由します。

inotifywaitイベントを検出すると終了します。オプション-rを渡すと、ディレクトリを再帰的に監視できます。例:inotifywait -r mydirectory

すべてのイベントを監視するのではなく、監視するイベントを指定することもできます。ファイルまたはディレクトリのコンテンツの変更のみを待機するには、オプション-e modifyを使用します。

+0

例を挙げることはできますか? – Jon

+1

@Jon 'inotifywatch'よりもこのタスクに適していると思われる' inotifywait'の例を追加しました。 – scai

7

iWatchをチェックアウト:

ウォッチは、リアルタイムファイルシステム監視プログラムです。これは、ファイルシステムの変更を検出し、すぐに報告するためのツールです.Itは、XML形式のシンプルな設定ファイルを使用し、Linuxカーネルのファイル変更通知システムであるinotifyに基づいています。

よりも、あなたは簡単にファイルを見ることができる:

iwatch /path/to/file -c 'run_you_script.sh' 
+0

これはもっと良い答えかもしれませんが、私はDIYソリューションをinotify-toolsを使用する方が好きです。 – Christian

5

これは質問で提供さ答えを改良したものです。スクリプトに割り込むと、実行プロセスが強制終了されます。

#!/bin/sh 

sigint_handler() 
{ 
    kill $PID 
    exit 
} 

trap sigint_handler SIGINT 

while true; do 
    [email protected] & 
    PID=$! 
    inotifywait -e modify -e move -e create -e delete -e attrib -r `pwd` 
    kill $PID 
done 
+1

ありがとう! 'touch somefile'が再起動をトリガーするようにするには、' -e attrib'を追加する必要があることに注意してください。 – seanf