下記コマンドでは、inotifywaitコマンドに複数の引数を与えて、
監視の仕方、結果出力の仕方、監視対象を指定している。
<使用したオプションの説明>
-e 監視するイベントの種類を指定する。(CREATE でファイル作成をキャッチ)
-m 監視中に該当するイベントが発生し処理が終わってもさらに続けて監視し続ける。
-r ディレクトリが作成されると再帰的にファイルを探索する。
--format イベントがあったことを通知する際の出力フォーマットの指定
最後に、監視対象のパスを指定
○ターゲットディレクトリを監視状態にした。
# /usr/bin/inotifywait -m -r -e CREATE --format "%w%f" /root/test
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
○動作テストを行った。
上記画面は、待機中となるため、別のコンソールからテストする。
テスト用ディレクトリに移動した。
# cd /root/test
テスト用ファイルは、一つ階層上の/rootにbディレクトリにまとめて用意した
# ls ../b
abc.txt abcd.txt abcde.txt abcdef.txtテスト用ファイルの入ったbディレクトリを、カレントディレクトリに再帰コピーした。
# cp ../b . -R
○結果
すると、上記の待機中画面に次のように、CREATEイベントの詳細が表示された。
/root/test/b
/root/test/b/abc.txt
/root/test/b/abcd.txt
/root/test/b/abcde.txt
/root/test/b/abcdef.txt
○イベントの発生結果一覧をwhileで処理
# /usr/bin/inotifywait -m -e CREATE --format "%w%f" -r /root/test | while read NEWFILE || [ -n $NEWFILE ] ; do echo $NEWFILE ; done
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/root/test/b
/root/test/b/abcd.txt
/root/test/b/abc.txt
/root/test/b/abcde.txt
前例と同じbディレクトリをコピーしてみた
しかし、上記のように、4つあるファイルのうち3つのCREATEイベントしかキャッチできなかったようである。
また、サブディレクトリをワンライナーなどのコマンドで一気に作成しても、
最初のサブディレクトリの新規作成イベントしか取得できなかった。
これはinotify の処理の限界なのだろう。
サブディレクトリがツリーに作成されたときに、
watchもまたこのサブディレクトリに作成され再帰監視処理に備えられようとするものの、
この準備が完了するまでにファイルや別のサブディレクトリが作成されてしまう可能性がある。
すると、サブディレクトリに作成されたファイルやディレクトリの作成イベントを取りこぼしてしまう現象が発生するという理由らしい。(†1)
こういう性質を知ってうまく使えばいいと思う。
ディレクトリにファイルを追加していく際のイベント取得は問題ないのだろう。
サブディレクトリの作成時には上記のことを念頭に置いておけばいい。
<参考>
1、inotify missing events
< https://stackoverflow.com/questions/15806488/inotify-missing-events > 2019年2月4日
2、inotify-toolsでファイルやディレクトリを監視する
< https://qiita.com/stc1988/items/464410382f8425681c20 >2019年2月4日
3、inotifywaitコマンドの使い方
< https://qiita.com/hana_shin/items/9e03ad7a40b4fd7afb67 >2019年2月4日
4、[Linux] inotifywaitを使ってファイル更新時に任意のコマンドを実行する
< https://qiita.com/sonodar/items/ddeeb98525ef4c03d48e >2019年2月4日
5、BASHのwhile readで最終行が処理されない問題の解決方法
< https://qiita.com/Ets/items/a7fa24b138b8ee883dac > 2019年2月4日
6、if 文と test コマンド
< https://shellscript.sunone.me/if_and_test.html > 2019年2月4日