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

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

/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/

出力には統計のみが印刷されますが、予想されるファイルは印刷されません(例:ここまたはここ)。さまざまな種類のアクセス(などcatを介して)を試しましたが、mktemp結果は同じです。

私が逃したものは何ですか? VPSを使用していて、一部のコンテンツが制限されているためですか?

オペレーティングシステム:VPSのDebian 7.3(inotify-tools)

答え1

これは、ツールの使用方法inotifywatchとツール自体の動作方法によるものです。を実行すると、すべてのファイルが表示さinotifywatch -r /tmpれ始めます。/tmpすでに内部に。からファイルを作成すると、ディレクトリメタデータが更新され、/tmp新しいファイルのinode番号が含まれます。これは、変更がからで/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: [...] watch ディレクトリ内に新しいディレクトリを作成する場合自動的に監視されます。

編集する:2つの例を挙げると少し混乱していますが、最初のケース、ユーザーがinotifywatch~/*拡張、ここでdon_crisstiのコメントをご覧ください。)。理論~/.*的にはホームディレクトリ~/.も含める必要があり、~/..スイッチと組み合わせることで-rシステム全体を監視できます。

しかしそれははいトリガーされたファイルの名前を取得できます。作るイベントは監視対象のディレクトリにありますが、この情報は検索されないようですinotifywatch(ディレクトリ名よりも少し深い場所に保存されています)。非常に同様に動作し、より多くの出力オプションを提供するinotify-toolsという別のツールがあります(ここで探しているものを含む)。inotifywaitinotify-watch%f

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

~からマニュアルページ:

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

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

%e:発生したイベントをカンマで区切って置き換えます。

また、-mオプション(モニター)はinotifywait最初のイベント以降も引き続き実行され、非常に似た動作を再現しますinotifywatch

関連情報