ディレクトリを再帰的に監視するループを持つbashスクリプトがあります。
while true
do
if path=`inotifywait -q -r -e create --format %w%f $watchpath`; then
#modify file
fi
done
私が正しく覚えている場合は、次の問題が発生します。
そのディレクトリに多数のファイルが作成された場合、またはコンピュータが他の操作で忙しい場合、inotifywait
そのファイルは再度到達する前に作成されない可能性があります。つまり、そのファイルは無視されます。
これを軽減する方法はありますか?変更されたファイルストリーム/ソースを継続的に「監視」して処理する方法はありますか?
答え1
inotifywait
1つの方法はモニタモードで実行することです。たとえば、次のようになります。
inotifywait -m -q -r -e create --format '%w%f' "$watchpath" |
while read -r path; do
: # do something with path
done
ただし、プロセス間にはまだ競合があり、シェルユーティリティを使用して競合状態を回避する方法があるかどうかはわかりません。
〜でもマニュアルページこれをメモの下にリストします。
inotify APIは、影響を受けるファイルをファイル名で識別します。ただし、アプリケーションがinotifyイベントを処理すると、ファイル名が削除されたか名前が変更された可能性があります。
答え2
ウォッチドッグモードを使用するため、-m
ファイルinotifywait
システム変更後に終了せずに標準出力に出力されます。これをinotofywaitの行を読み取って処理するリーダースクリプトにストリーミングできます。