inotifyを使用してディレクトリを監視するが100%機能しない


10

特定のディレクトリを監視するbashスクリプトを記述しました/root/secondfolder/

#!/bin/sh

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

私はと呼ばれるファイルを作成するときfourth.txt/root/secondfolder/、それまでと書き込みものを、それを保存して閉じ、それは次のように出力します。

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

ただし、「close_write」はエコーされません。何故ですか?

回答:


16

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を使用できない場合は、代わりにコマンドをループにパイプすることができます。このモードでは、イベントごとに1行の出力が生成されるため、ループはそれぞれ1回実行されます。inotifywait ... | while read line ...inotifywait


2
コマンドをループにパイプすることで機能します。ありがとうございます。
mib1413456 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.