以前、特定のディレクトリを監視し、ファイルに対して特定のイベントがあった場合は自動的にコマンドを実行させる事が出来るincronというものを紹介したが、このプログラムはフォルダの再帰的な監視が出来ないという(実用的には結構致命的な)欠点があった。

その欠点が解消されたincronライクなコマンドが、今回紹介する『Watcher』コマンドだ。

1.インストール

まずはインストールから。
Watcherはpythonで書かれており、動作にはPython 2.7とpyinotifyライブラリが必要になるので、まずはそれらをインストールする。

Debian/Ubuntuの場合

apt-get install python python-pyinotify

RHEL系の場合

yum install python python-pip
pip install pyinotify

次に、githubからWathcerのプログラムをダウンロードし、PATHの通っているディレクトリにコピーする。
ここでは、「/work/bin」というディレクトリを作成してコピーしている。

git clone https://github.com/splitbrain/Watcher
mv Watcher/{watcher.ini,watcher.py} /work/bin/

これでインストールが出来た。

2.監視対象の設定

Watcherでの監視の設定は、incronのものとは少し異なる。
watcher.pyと同じディレクトリにある「watcher.ini」というファイルに、以下のように記述することで監視設定を行う。

; ----------------------
; General Settings
; ----------------------
[DEFAULT]

; where to store output
logfile=ログ・ファイルのPATH

; where to save the PID file
pidfile=プロセスファイルのPATH

; ----------------------
; Job Setups
; ----------------------

; job1:1つ目のジョブ
[job1]
; directory or file to watch.  Probably should be abs path.
watch=監視対象とするディレクトリのPATH

; list of events to watch for.
; supported events:
; 'access' - File was accessed (read) (*)
; 'attribute_change' - Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
; 'write_close' - File opened for writing was closed (*)
; 'nowrite_close' - File not opened for writing was closed (*)
; 'create' - File/directory created in watched directory (*)
; 'delete' - File/directory deleted from watched directory (*)
; 'self_delete' - Watched file/directory was itself deleted
; 'modify' - File was modified (*)
; 'self_move' - Watched file/directory was itself moved
; 'move_from' - File moved out of watched directory (*)
; 'move_to' - File moved into watched directory (*)
; 'open' - File was opened (*)
; 'all' - Any of the above events are fired
; 'move' - A combination of 'move_from' and 'move_to'
; 'close' - A combination of 'write_close' and 'nowrite_close'
;
; When monitoring a directory, the events marked with an asterisk (*) above
; can occur for files in the directory, in which case the name field in the
; returned event data identifies the name of the file within the directory.
events=イベントの種類

; Comma separated list of excluded dir. Absolute path needed.
; Leave blank if no excluded dir setted
excluded=

; if true, watcher will monitor directories recursively for changes
; 再帰的に監視を行うか否か
recursive=true

; if true, watcher will automatically watch new subdirectory
autoadd=true

; the command to run. Can be any command. It's run as whatever user started watcher.
; The following wildards may be used inside command specification:
; $$ dollar sign
; $watched watched filesystem path (see above)
; $filename event-related file name
; $tflags event flags (textually)
; $nflags event flags (numerically)
; $cookie event cookie (integer used for matching move_from and move_to events, otherwise 0)
; 実行させるコマンド
command=ls -l $filename

複数ジョブを作成する場合は、[job2]、[job3]と同じように追記していけばいい。
設定ファイルの編集が完了したら、以下のコマンドでWatcherを起動する。なお、以下のコマンドでは-cオプションでiniファイルを指定している。

watcher.py -c /work/bin/watcher.ini start

これで、incron的な事を再帰的に行う事が出来る。

なお、設定によっては以前記述した、inotifywaitを用いたファイルのバージョニング・バックアップスクリプトと同じような事も出来る。
実行するコマンドの所で、以下のように記述することで自動バックアップを行える。

command=cp $filename /バックアップ先ディレクトリ/`echo $filename | sed -e 's#/#!#g'`.`date +%Y%m%d_%H%M%S`

結構便利だと思うので、今後こういうのが主流になってくれるといいなぁ…