web-dev-qa-db-ja.com

追加したファイルの変更をinotifywatchが検出しないのはなぜですか?

inotifywatchを使用して/tmpフォルダの変更を監視しようとしています:

Sudo inotifywatch -v -r /tmp

いくつかのファイル(touch /tmp/test-1 /tmp/test-2)を作成した後、inotifywatchを終了します( Ctrl-C 次の統計が表示されます。

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

出力は統計だけを出力しますが、予想したファイルは出力しません( here または here のように)。さまざまな種類のアクセス(catmktempなど)を試しましたが、同じことです。

私は何か見落としてますか?それは私がVPSを使用していて、何かが制限されているためです。

OS:VPS上のDebian 7.3(inotify-tools)

14
kenorb

これは、inotifywatchの使用方法とツール自体の動作によるものです。 _inotifywatch -r /tmp_を実行すると、_/tmp_と、alreadyが含まれているすべてのファイルの監視を開始します。 _/tmp_内にファイルを作成すると、ディレクトリメタデータが更新され、新しいファイルのiノード番号が含まれます。つまり、変更は_/tmp_ではなく_/tmp/test-1_で行われます。さらに、inotifywatchの開始時に_/tmp/test-1_が存在しなかったため、inotify時計が配置されていません。 これは、監視を配置した後に作成されたファイルで発生するイベントが検出されないことを意味します。自分で見た方が理解しやすいかもしれません。

_$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
_

inotify_add_watch(2)でトレースメカニズムを有効にした場合 の場合、最後のコマンドでinotifywatchによって設定されたウォッチの数がわかります。この数は、inotifywatch自体によって与えられた数と同じでなければなりません。次に、_/tmp_内にファイルを作成し、もう一度確認します。

_$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
_

数は増加しません。つまり、新しいファイルは監視されません。代わりにディレクトリを作成すると、動作が異なることに注意してください。

_$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
_

これは_-r_スイッチの動作によるものです

_-r_、_--recursive_:[...]監視対象ディレクトリ内に新しいディレクトリが作成された場合それらは自動的に監視されます。

編集:2つの例の間で少し混乱しましたが、 最初の場合 、ユーザーがinotifywatch on _~/*_(展開された don_crisstiのコメントはこちらを参照 )。 _~/.*_には_~/._が含まれているため、ホームディレクトリも監視されます。理論的には、_~/.._スイッチと組み合わせてシステム全体を監視する_-r_も含める必要があります。

ただし、監視されているディレクトリでcreateイベントをトリガーするファイルの名前を取得することはis可能です、それでもinotifywatchはこの情報を取得しないと思います(ディレクトリ名より少し深い場所に保存されます)。 _inotify-tools_はinotifywaitと呼ばれる別のツールを提供します。これは_inotify-watch_とほとんど同じように動作し、より多くの出力オプション(_%f_を含む)を提供します。ここに) :

_inotifywait -m --format "%e %f" /tmp
_

manページ から:

_--format <fmt>_ printfに似た構文を使用して、ユーザー指定の形式で出力します。 [...]次の変換がサポートされています。

_%f_:ディレクトリ内でイベントが発生すると、イベントが発生したファイルの名前に置き換えられます

_%e_:発生したイベントに置き換えられ、カンマで区切られます。

また、_-m_オプション(モニター)は、最初のイベントの後でinotifywaitを実行し続けるため、inotifywatchと非常によく似た動作が再現されます。

14
John WH Smith