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


14

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

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

これはinotifywatch、使用している方法と、ツール自体の動作方法によるものです。を実行するとinotifywatch -r /tmp、視聴を開始/tmpし、既にその中にあるすべてのファイルを見ることができます。内部/tmpにファイルを作成すると、ディレクトリメタデータが更新され、新しいファイルのiノード番号が含まれます。つまり、変更は/tmpでなくで行われ/tmp/test-1ます。また、以降の/tmp/test-1時にはなかったinotifywatch始め、何もありません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:[...]監視対象ディレクトリ内に新しいディレクトリが作成された場合、それらは自動的に監視されます。

編集:私はあなたの二つの例の間で混乱少しを得たが、最初のケースでユーザー・コールので、時計が正しく配置されているinotifywatch~/*(拡張され、ここでdon_crisstiさんのコメントを参照してください)。~/.*が含まれているため、ホームディレクトリも監視されます~/.。理論的に~/..は、-rスイッチと組み合わせてシステム全体を監視する必要があるを含む必要があります。

ただし、監視ディレクトリで作成イベントをトリガーするファイルの名前を取得することできますが、この情報は取得されません(ディレクトリ名よりも少し深い場所に保存されます)。と呼ばれる別のツールを提供します。これは、とほぼ同様に動作し、より多くの出力オプションを提供します(ここで探しているものを含む)。inotifywatchinotify-toolsinotifywaitinotify-watch%f

inotifywait -m --format "%e %f" /tmp

manページから:

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

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

%e:発生したイベントにコンマ区切りで置き換えられます。

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


1
.bashrcこの例ではserverfault、ユーザーがホームディレクトリを再帰的に監視するために@ が統計に表示されませんが、path/.*展開されるため、結果としてpath/.bashrc含まれる)すべての.fileに監視が設定されます。OPが使用するコマンドはファイル名を出力しません。これは、監視が/tmpサブディレクトリに設定されているため、統計は/tmpサブディレクトリとそのサブディレクトリのみに関連するためです(つまり、ファイルにアクセス/移動/などが表示されますが、名前)。
don_crissti 14年

@don_crisstiおっと、OPで指定された2つの例を混同しました。回答を編集しました、ありがとう!
ジョンWHスミス14年

ありがとう、それは役に立ちました。ここで新しく作成されたすべてのテスト*ファイルの内容を表示するには、私のコマンドがあります/tmpinotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
ケノーブ

また:「ウォッチが配置された後に作成されたファイルで発生するイベントは検出されないことを意味します。」ウォッチは格納ディレクトリにすでに設定されているため、イベント(ファイル作成も)が検出されます。その特定のディレクトリの統計に反映されます。inotifywatchOPの質問の出力を参照してください:2つのcreateイベントがあります(したがって検出されます)がinotifywatch、ディレクトリ(+任意のサブディレクトリ)を監視するため、統計はそのディレクトリのみに関係します。
don_crissti 14年

1
私たちはここで同じ波長にいるとは思わない... man inotifyWhen a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.また、man inotifywatchどのイベントが監視されているかについても明確です:EVENTS>> ... 監視されているファイルまたは監視されているディレクトリ内のファイルがアクセス/クローズ/オープン/など「ファイルで発生する」イベントを含むことを意味します)。親ディレクトリに監視を設定した後に作成されたファイルのイベントは、検出され、inotifywatch統計に反映されます(これらのイベントが発生したファイルについては言及しません)。
don_crissti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.