0

inotifywait man の変更では、次のように述べられています

-r, --recursive 引数として渡されたディレクトリのすべてのサブディレクトリを監視します。監視は、無制限の深さまで再帰的に設定されます。シンボリック リンクはトラバースされません。新しく作成されたサブディレクトリも監視されます。

警告: 大きなツリーのルート ディレクトリを監視しているときにこのオプションを使用すると、すべての inotify 監視が確立されるまでにかなりの時間がかかる場合があり、その間はイベントを受信できません。また、サブディレクトリごとに 1 つの inotify ウォッチが確立されるため、ユーザーごとの inotify ウォッチの最大数に達する可能性があります。デフォルトの最大値は 8192 です。/proc/sys/fs/inotify/max_user_watches に書き込むことで増やすことができます。

これは、 が呼び出されるたびにinotifywait、大きなディレクトリでは遅延が発生することを意味します。したがって、監視機能を使用して大きなディレクトリを常に監視するようにします。

inotifywait -m /home/user/Documents

そのようにディレクトリを手動でループするよりも効率的です(manページの例から)

while inotifywait /home/user/Documents; do
 #Do Something for each file change
done

while ループを繰り返すたびに、inotifywait を再度設定する必要があります。しかし、最初のオプションでは、リターンに基づいて実行できません。理想的には、私が欲しいのはそのようなコールバック関数です

inotifywait -m --callback ./callback.sh /home/user/Documents

socallback.shは毎回呼び出され、 の戻り値が返されますinotifywait。これをどのように実装しますか?

4

1 に答える 1

3

次のようにパイプできます。

inotifywait -m /my/directory | while read LINE; do ./do_something.sh $LINE; done

特定の操作に対して多くのイベントが発生し、それぞれがスクリプトの起動をトリガーすることに注意してください。

また、perl やその他の言語を使用して API を直接使用することもできるため、柔軟性が大幅に向上します。

于 2011-11-11T19:37:43.133 に答える