特定のディレクトリを監視するためにbashスクリプトを作成しました/root/secondfolder/
。
#!/bin/sh
while inotifywait -mr -e close_write "/root/secondfolder/"
do
echo "close_write"
done
fourth.txt
inというファイルを作成し、/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
このモードでは、各イベントが出力ラインを生成するため、各イベントループは一度実行されます。