1 環境

VMware Workstation 12 Player上のゲストマシンを使っています。

[root@client ~]#cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@client ~]# uname -r
3.10.0-514.el7.x86_64

2 インストール方法

inotify-toolsはepelれポジトリにあるので、さきにepel-releaseをインストールする。
[root@server ~]# yum install epel-release

inotify-toolsをインストールする。
[root@server ~]# yum install inotify-tools

[root@server ~]# inotifywait --help
inotifywait 3.14

3 オプション一覧

[root@server ~]# inotifywait --help
inotifywait 3.14
Wait for a particular event on a file or set of files.
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
Options:
        -h|--help       Show this help text.
        @<file>         Exclude the specified file from being watched.
        --exclude <pattern>
                        Exclude all events on files matching the
                        extended regular expression <pattern>.
        --excludei <pattern>
                        Like --exclude but case insensitive.
        -m|--monitor    Keep listening for events forever.  Without
                        this option, inotifywait will exit after one
                        event is received.
        -d|--daemon     Same as --monitor, except run in the background
                        logging events to a file specified by --outfile.
                        Implies --syslog.
        -r|--recursive  Watch directories recursively.
        --fromfile <file>
                        Read files to watch from <file> or `-' for stdin.
        -o|--outfile <file>
                        Print events to <file> rather than stdout.
        -s|--syslog     Send errors to syslog rather than stderr.
        -q|--quiet      Print less (only print events).
        -qq             Print nothing (not even events).
        --format <fmt>  Print using a specified printf-like format
                        string; read the man page for more details.
        --timefmt <fmt> strftime-compatible format string for use with
                        %T in --format string.
        -c|--csv        Print events in CSV format.
        -t|--timeout <seconds>
                        When listening for a single event, time out after
                        waiting for an event for <seconds> seconds.
                        If <seconds> is 0, inotifywait will never time out.
        -e|--event <event1> [ -e|--event <event2> ... ]
                Listen for specific event(s).  If omitted, all events are
                listened for.

Exit status:
        0  -  An event you asked to watch for was received.
        1  -  An event you did not ask to watch for was received
              (usually delete_self or unmount), or some error occurred.
        2  -  The --timeout option was given and no events occurred
              in the specified interval of time.

Events:
        access          file or directory contents were read
        modify          file or directory contents were written
        attrib          file or directory attributes changed
        close_write     file or directory closed, after being opened in
                        writeable mode
        close_nowrite   file or directory closed, after being opened in
                        read-only mode
        close           file or directory closed, regardless of read/write mode
        open            file or directory opened
        moved_to        file or directory moved to watched directory
        moved_from      file or directory moved from watched directory
        move            file or directory moved to or from watched directory
        create          file or directory created within watched directory
        delete          file or directory deleted within watched directory
        delete_self     file or directory was deleted
        unmount         file system containing file or directory unmounted

4 もっとも単純な使い方

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt
[root@server ~]# ls /a/test.txt
/a/test.txt

ファイル(/a/test.txt)にイベントが発生するのを待つ。
[root@server ~]# inotifywait /a/test.txt
Setting up watches.
Watches established.

ファイルをリードする。
[root@server ~]# cat /a/test.txt

OPENイベントが発生したことがわかる。
[root@server ~]# inotifywait /a/test.txt
Setting up watches.
Watches established.
/a/test.txt OPEN

4 モニターオプションの使い方(-m)

mオプションを指定しないと、最初のイベントが発生すると、inotifywait が終了してしまいます。
継続してイベントを監視したい場合はmオプションを使います。

inotifywait コマンドを実行する。
[root@server ~]# inotifywait -m /a/test.txt
Setting up watches.
Watches established.

ファイルをリードする。
[root@server ~]# cat /a/test.txt

ファイルをリードすると、イベントが3つ(OPEN,CLOSE_NOWRITE,CLOSE)発生することがわかる。
[root@server ~]# inotifywait -m /a/test.txt
Setting up watches.
Watches established.
/a/test.txt OPEN
/a/test.txt CLOSE_NOWRITE,CLOSE

5 特定のイベントだけを監視する方法(-e)

5.1 イベントの種類

Events:
        access          file or directory contents were read
        modify          file or directory contents were written
        attrib          file or directory attributes changed
        close_write     file or directory closed, after being opened in
                        writeable mode
        close_nowrite   file or directory closed, after being opened in
                        read-only mode
        close           file or directory closed, regardless of read/write mode
        open            file or directory opened
        moved_to        file or directory moved to watched directory
        moved_from      file or directory moved from watched directory
        move            file or directory moved to or from watched directory
        create          file or directory created within watched directory
        delete          file or directory deleted within watched directory
        delete_self     file or directory was deleted
        unmount         file system containing file or directory unmounted

5.2 openイベントの使い方(-e open)

openイベントは、ファイルがオープンされたときに発生します。

イベントが発生するのを待つ。
[root@server ~]# inotifywait -m -e open /a/test.txt
Setting up watches.
Watches established.

ファイルをリードする。
[root@server ~]# cat /a/test.txt

ファイルをリードすると、openイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e open /a/test.txt
Setting up watches.
Watches established.
/a/test.txt OPEN

5.3 accessイベントの使い方(-e access)

accessイベントは、ファイルの中身をリードしたときに発生します。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt
[root@server ~]# echo 1 > /a/test.txt

イベントが発生するのを待つ。
[root@server ~]# inotifywait -m -e access /a/test.txt
Setting up watches.
Watches established.

ファイルの中身をリードする。
[root@server ~]# cat /a/test.txt
1

ファイルの中身をリードすると、access イベントが発生することがわかる。
[root@server ~]# inotifywait -m -e access /a/test.txt
Setting up watches.
Watches established.
/a/test.txt ACCESS

5.4 attribイベントの使い方(-e attrib)

attribイベントは、ファイルの属性が変更されたときに発生します。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

イベントが発生するのを待つ。
[root@server ~]# inotifywait -m -e attrib /a/test.txt
Setting up watches.
Watches established.

ファイルをリードする。attribイベントは発生しません。
[root@server ~]# cat /a/test.txt

ファイルに書き込みをする。attribイベントは発生しません。
[root@server ~]# echo 1 > /a/test.txt

ファイルの属性変更を変更する。
[root@server ~]# chmod 666 /a/test.txt

ファイルの属性を変更すると、attribイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e attrib /a/test.txt
Setting up watches.
Watches established.
/a/test.txt ATTRIB

5.5 modifyイベントの使い方(-e modify)

modifyイベントは、ファイルに書き込みが行われたときに発生します。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

modifyイベントが発生したとき、ログを出力する。
[root@server ~]# inotifywait -m -e modify /a/test.txt
Setting up watches.
Watches established.

ファイルをリードする。modifyイベントは発生しません。
[root@server ~]# cat /a/test.txt

ファイルの属性変更を変更する。modifyイベントは発生しません。
[root@server ~]# chmod 666 /a/test.txt

ファイルに書き込みをする。
[root@server ~]# echo 1 > /a/test.txt

ファイルに書き込みを行うと、modifyイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e modify /a/test.txt
Setting up watches.
Watches established.
/a/test.txt MODIFY

5.6 deleteイベントの使い方(-e delete)

deleteイベントは、指定したディレクト下のファイルやディレクトリが削除されると発生します。

テスト用ファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test1.txt

deleteイベントの発生を待つ。
[root@server ~]# inotifywait -m -e delete /a
Setting up watches.
Watches established.

[root@server ~]# rm /a/test1.txt
rm: 通常の空ファイル `/a/test1.txt' を削除しますか? y

ファイルを削除すると、deleteイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e delete /a
Setting up watches.
Watches established.
/a/ DELETE test1.txt

5.7 delete_selfイベントの使い方(-e delete_self)

delete_selfイベントは、指定したファイルやディレクトリが削除されると発生します。

テスト用ファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test1.txt

delete_selfイベントの発生を待つ。
[root@server ~]# inotifywait -m -e delete_self /a/test1.txt
Setting up watches.
Watches established.

ファイルを削除する。
[root@server ~]# rm /a/test1.txt
rm: 通常の空ファイル `/a/test1.txt' を削除しますか? y

ファイルを削除すると、delete_selfイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e delete_self /a/test1.txt
Setting up watches.
Watches established.
/a/test1.txt DELETE_SELF

5.8 createイベントの使い方(-e create)

createイベントは、指定したディレクトリ配下にファイルやディレクトリを作成すると発生します。

テスト用のディレクトリを作成する。
[root@server ~]# mkdir /a

createイベントの発生を待つ。
[root@server ~]# inotifywait -m -e create /a
Setting up watches.
Watches established.

ディレクトリを作成すると、createイベントが発生していることがわかる。
[root@server ~]# mkdir /a/b
[root@server ~]# inotifywait -m -e CREATECREATE/a
Setting up watches.
Watches established.
/a/ CREATE,ISDIR b

ファイルを作成すると、createイベントが発生することがわかる。
[root@server ~]# touch /a/test.txt
[root@server ~]# inotifywait -m -e create /a
Setting up watches.
Watches established.
/a/ CREATE test.txt

5.9 moved_fromイベントの使い方(-e moved_from)

moved_fromイベントは、指定したディレクトリ配下からファイルやディレクトを移動すると発生します。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

moved_fromイベントの発生を待つ。
[root@server ~]# inotifywait -m -e moved_from /a
Setting up watches.
Watches established.

/a配下のファイルを/tmpに移動する。
[root@server ~]# mv /a/test.txt /tmp/

ファイルを移動すると、moved_fromイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e moved_from /a
Setting up watches.
Watches established.
/a/ MOVED_FROM test.txt

5.10 moved_toイベントの使い方(-e moved_to)

moved_toイベントは、指定したディレクトリ配下へファイルやディレクトを移動すると発生します。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

ファイルの移動先を監視対象にして、イベントが発生するのを待つ。
[root@server ~]# inotifywait -m -e moved_to /tmp
Setting up watches.
Watches established.

ファイルを/aから/tmpに移動する。
[root@server ~]# mv /a/test.txt /tmp/

ファイルを移動すると、moved_toイベントが発生することがわかる。
[root@server ~]# inotifywait -m -e moved_to /tmp
Setting up watches.
Watches established.
/tmp/ MOVED_TO test.txt

6 リカーシブオプションの使い方(-r)

最上位のディレクトリを指定するだけで、その配下にあるすべてのファイル、ディレクトリを
監視対象にすることができます。

テスト用のファイルを作成する。
[root@server ~]# mkdir -p /a/b/c
[root@server ~]# touch /a/b/c/test.txt
[root@server ~]# ls -l /a/b/c/test.txt
-rw-r--r--. 1 root root 0  3月 16 21:33 /a/b/c/test.txt

6.1 リカーシブオプションを指定しない場合

/aディレクトリ配下で発生するイベントを監視する。
[root@server ~]# inotifywait -m /a
Setting up watches.
Watches established.

ファイルをリードする。
[root@server ~]# cat /a/b/c/test.txt

イベントが表示されないことがわかる。
[root@server ~]# inotifywait -m /a
Setting up watches.
Watches established.

6.2 リカーシブオプションを指定した場合

リカーシブオプションオプションを指定して、/aディレクトリ配下で発生するイベントを監視する。
[root@server ~]# inotifywait -m -r /a
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

ファイルをリードする。
[root@server ~]# cat /a/b/c/test.txt

イベントが3つ(OPEN,CLOSE_NOWRITE,CLOSE)表示されたことがわかる。
[root@server ~]# inotifywait -m -r /a
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/a/b/c/ OPEN test.txt
/a/b/c/ CLOSE_NOWRITE,CLOSE test.txt

7 時刻を表示する方法(timefmt)

timefmtは、formatオプションと一緒に使う必要があります。
timefmtは、時刻の表示形式を指定します。
formatは、表示項目を指定します。
表示項目としては、時刻(%T)、監視対象(%w)、監視イベント(%e)等が指定できます。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

[root@server ~]# inotifywait -m --format '%T %w %f %e' --timefmt '%F %T' /a
Setting up watches.
Watches established.

/aディレクトリ配下のファイルを表示する。
[root@server ~]# ls /a

[root@server ~]# inotifywait -m --format '%T %w %f %e' --timefmt '%F %T' /a
Setting up watches.
Watches established.
2018-03-17 09:08:21 /a/  OPEN,ISDIR
2018-03-17 09:08:21 /a/  CLOSE_NOWRITE,CLOSE,ISDIR

/a配下のファイルを/tmpに移動する。
[root@server ~]# mv /a/test.txt /tmp/

[root@server ~]# inotifywait -m --format '%T %w %f %e' --timefmt '%F %T' /a
2018-03-17 09:09:56 /a/ test.txt MOVED_FROM

8 出力メッセージをファイルに保存する方法(o)

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

イベントの発生を待つ。イベント発生時のメッセージをファイル(event.log)に保存する。
[root@server ~]# inotifywait -m /a -o event.log
Setting up watches.
Watches established.

ファイルを/aと/tmp間で移動する。
[root@server ~]# mv /a/test.txt /tmp/
[root@server ~]# mv /tmp/test.txt /a/

メッセージを確認する。MOVED_FROM,MOVED_TOイベントが発生したことがわかる。
[root@server ~]# cat event.log
/a/ MOVED_FROM test.txt
/a/ MOVED_TO test.txt

9 デーモンプロセスとして起動する方法(-d)

dオプションを使うと、inotifywaitをデーモンプロセスとして動かすことがでます。
このとき、oオプションも一緒に指定する必要があります。
oオプションで、デーモンプロセスが出力するメッセージの出力先を指定します。

[root@server ~]# inotifywait -m -d -o /tmp/event.log /a
[root@server ~]# ps -C inotifywait -o comm,args,pid,ppid
COMMAND         COMMAND                        PID   PPID
inotifywait     inotifywait -m -d -o /tmp/e  19612      1

[root@server ~]# mv /a/test.txt /tmp/
[root@server ~]# mv /tmp/test.txt /a/

[root@server ~]# cat /tmp/event.log
/a/ MOVED_FROM test.txt
/a/ MOVED_TO test.txt

10 csvフォーマットで出力する方法(-c)

inotifywaitが出力するメッセージが","で区切られて表示されます。

テスト用のファイルを作成する。
[root@server ~]# mkdir /a
[root@server ~]# touch /a/test.txt

イベントの発生を待つ。
[root@server ~]# inotifywait -m -c /a
Setting up watches.
Watches established.

ファイルをリードする。
[root@server ~]# cat /a/test.txt

出力されたメッセージが","で区切られていることがわかる。
[root@server ~]# inotifywait -m -c /a
Setting up watches.
Watches established.
/a/,OPEN,test.txt
/a/,"CLOSE_NOWRITE,CLOSE",test.txt

X 参考情報

How to use inotify-tools to trigger scripts on filesystem events

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.