LoginSignup
308
280

More than 5 years have passed since last update.

inotify-toolsでファイルやディレクトリを監視する

Last updated at Posted at 2014-05-22

Linux2.6から追加されたinotifyというAPIは、ファイルやディレクトリーでオープン、クローズ、移動/名前変更、削除、作成、属性の変更などといったファイルシステムイベントを監視することができます。

inotify API群を利用して自分でファイルシステムイベント監視プログラムを実装することができますが、
今回は、inotify-toolsというinotifyを利用したファイルシステムイベント監視ツールを使用します。

inotifyイベント

inotifyでは対象のファイルまたはディレクトリに対して以下のファイルシステムイベントが監視できます。
※対象がディレクトリの場合は、ディレクトリ自身とその配下のファイルが対象となります。

イベント名 イベント発生タイミング
ACCESS readなどでアクセスされた
MODIFY writeなどでファイル内容が変更された
ATTRIB アクセス件やタイムスタンプなどのメタデータが変更された
CLOSE_WRITE 書き込みモードでオープンされた後クローズされた
CLOSE_NOWRITE 読み込みモードオープンされた後クローズされた
CLOSE オープンモードに関わらずクローズされた
OPEN オープンされた
MOVED_TO 対象ディレクトリ内へ移動された
MOVED_FROM 対象ディレクトリ内から移動された
MOVE 対象自身が移動された
CREATE 対象ディレクトリ内で新規作成された
DELETE 対象ディレクトリ内で削除された
DELTELE_SELF 対象自身が削除された
UNMOUNT 対象を含むファイルシステムがアンマウントされた

inotify-tools

inotify-toolsはinotifyを使ったコマンドラインツールで、以下の2つから構成されます。

  • inotifywait
    • ファイルシステムイベントを待ち、発生時に表示する
  • inotifywatch
    • ファイルシステムイベントの統計を表示

インストール

inotify-toolsは以下のようにaptからインストールします。

$ sudo apt-get install inotify-tools

inotifywait

使い方

$ inotifywait [option] <file> [ ... ]

使用例

試しにファイルsample.txtの書き換えを監視してみます。
inotifywaitはバックグラウンドで動かします。

$ echo hoge > sample.txt
$ inotifywait sample.txt &
[1] 7071
$ echo huga > sample.txt
sample.txt MODIFY
[1]+  Done                    inotifywait sample.txt

ファイル内容変更のMODIFYが通知されました。
いや、MODIFYだけっておかしくないか?

notifywaitは-mオプションをつけないと一度しかイベント通知しません。
-mオプションをつけて再度確認します。

$ inotifywait -m sample.txt &
[1] 7105
$ echo huga > sample.txt
sample.txt OPEN
sample.txt MODIFY
sample.txt CLOSE_WRITE,CLOSE

めでたくOPEN,MODIFY,CLOSE_WRITE,CLOSEが通知されました。

その他色々とファイル操作して、どんな通知されるか見てみましょう。

$ mkdir hoge
$ inotifywait -m hoge &
$ cd hoge/
$ touch sample.txt
hoge/ CREATE sample.txt
hoge/ OPEN sample.txt
hoge/ ATTRIB sample.txt
hoge/ CLOSE_WRITE,CLOSE sample.txt
$ echo hoge >sample.txt
hoge/ MODIFY sample.txt
hoge/ OPEN sample.txt
hoge/ MODIFY sample.txt
hoge/ CLOSE_WRITE,CLOSE sample.txt
$ cat sample.txt
hoge/ OPEN sample.txt
hoge/ ACCESS sample.txt
hoge
hoge/ CLOSE_NOWRITE,CLOSE sample.txt 
$ chmod 666 sample.txt
hoge/ ATTRIB sample.txt
$ mv sample.txt test.txt
hoge/ MOVED_FROM sample.txt
hoge/ MOVED_TO test.txt
$ rm test.txt
hoge/ DELETE test.txt
$ cd ../
$ mv hoge fuga
hoge/ MOVE_SELF
$ rmdir fuga
hoge/ DELETE_SELF

UMOUNT以外は網羅できたかと思います。

出力フォーマット

--formatオプションをつけることで、出力結果のフォーマットが設定できます。
また、その時%Tで日時を付与したときは--timefmtstrftimeと同様の日時フォーマットも設定できます。

$ mkdir hoge
$ inotifywait -m --format '%T %w%f (%e)' --timefmt '%F %T' hoge &
$ touch hoge/sameple.txt
2014-05-21 15:58:33 hoge/sameple.txt (OPEN)
2014-05-21 15:58:33 hoge/sameple.txt (ATTRIB)
2014-05-21 15:58:33 hoge/sameple.txt (CLOSE_WRITE,CLOSE)

その他オプション

  • -h:ヘルプの表示
  • -r:対象がディレクトリ時に対象を再帰的に掘っていく
  • -c:通知結果をcsvで表示
  • -e <event>:eventで指定したイベントのみを通知するようにフィルタリングする
  • -t <seconds>:-mオプションを付けない場合にseconds秒後に監視を終了する
  • -d:デーモン化して動作する。結果は-oオプション指定ファイルか、-sオプションでsyslogに書き込む

inotifywatch

使い方

$ inotifywatch [option] <file> [ ... ]

使用例

ctrl+cでinotifywatchを停止するまで発生したファイルシステムイベントの統計情報が表示されます。

$ inotifywatch sample.txt &
[1] 7434
$ Establishing watches...
Finished establishing watches, now collecting statistics.
touch sample.txt
$ fg
inotifywatch sample.txt
^Ctotal  attrib  close_write  open  filename
3      1       1            1     sample.txt

参考URL

308
280
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
308
280