inotifyを使用してディレクトリを監視しますが、100%動作しません

inotifyを使用してディレクトリを監視しますが、100%動作しません

特定のディレクトリを監視するためにbashスクリプトを作成しました/root/secondfolder/

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

fourth.txtinというファイルを作成し、/root/secondfolder/ここに書き込んで保存して閉じると、次のように出力されます。

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

ただし、「close_write」はエコーされません。なぜそんなことですか?

答え1

inotifywait -m 「モニター」モードです:決して出ません。シェルはそれを実行し、終了コードがループ本文を実行するかどうかを知るまで待ちます。しかし、これは決して来ません。

削除すると-m動作します。

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

生産する

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

デフォルトでは、inotifywaitは、所望のループ条件である「最初のイベントが発生した後に終了」されます。


代わりに、次の標準出力を読む方が良いかもしれませんinotifywait

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

この(bash)スクリプトは、次のコマンドを使用して、コマンドの各出力行をループ内の変数inotifywaitとして読み込みます。$lineプロセスの交換。ループを介して毎回再帰監視を設定するのを防ぎ、コストがかかる可能性があります。 Bashにアクセスできない場合は、コマンドをループにパイプできますinotifywait ... | while read line ...inotifywaitこのモードでは、各イベントが出力ラインを生成するため、各イベントループは一度実行されます。

関連情報