inotifywaitは監視を設定した後にコマンドを実行します。

inotifywaitは監視を設定した後にコマンドを実行します。

シェルスクリプト(test.sh)内のいくつかのディレクトリ( "somedir")を再帰的に監視するためにinotifywaitを使用します。

#!/bin/sh
inotifywait -r -m -e close_write "somedir" | while read f; do echo "$f hi"; done

端末でこれを行うと、次のメッセージが表示されます。

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

私が必要とするのは、「somedir」の下のすべてのファイルをタッチすることです後ろに時計が確立されました。これを行うには、次を使用します。

find "somedir" -type f -exec touch {}

その理由は、クラッシュ後にinotifywaitが起動したときにその間に到着したすべてのファイルが決して選択されていないためです。だから質問は、どのように、いつするべきですかfind + touch?です。

今まで通話後数秒間スリープモードに設定しようとしましたが、test.sh「somedir」のサブディレクトリの数が増えると、長期的には機能しません。

プロセスが実行されていることを確認し、表示されるまでスリープしてみましたが、すべての監視が行われる前にプロセスが表示されるようです。

私は変更しようとしましたtest.sh

#!/bin/sh
inotifywait -r -m -e close_write "somedir" && find "somedir" -type f -exec touch {} | 
while read f; do echo "$f hi"; done

しかし、ファイルはまったく触れませんでした。だから本当に助けが必要です...

追加情報はtest.shバックグラウンドで実行されます。nohup test.sh &

どんなアイデアがありますか?ありがとう

注:@xaeの提案に従って、次のように使用します。

nohup test.sh > /my.log 2>&1 &
while :; do (cat /my.log | grep "Watches established" > /dev/null) && break; done;
find "somedir" -type f -exec touch {} \+

ベストアンサー1

inotifywait「という文字列を出力するとき時計が設立されました。「監視されているinodeを変更するのは安全です。ファイルをタッチする前に、標準エラーにこの文字列が表示されるのを待つ必要があります。

たとえば、このコードは次のようになります。

inotifywait -r -m -e close_write "somedir" \
2> >(while :;do read f; [ "$f" == "Watches established." ] && break;done;\
find "somedir" -type f -exec touch {} ";")\
| while read f; do echo "$f hi";done

おすすめ記事