incronとは?
- ファイルの作成、変更、削除、移動といったイベントを検知して、登録したジョブを実行させるものです。
- Linuxのinotifyという仕組みを使っている。(Linuxカーネル2.6.13以降で利用可能)
incronを選んだ理由
とあるファイルを修正した後に、必ずあるコマンドを実行して、ファイルを再作成する必要がある、それを毎回手動で行うのは面倒なので、色々調べた結果、incronにたどり着いた。
インストール手順
$ sudo yum install incron
起動
$ sudo /etc/init.d/incrond start
停止
$ sudo /etc/init.d/incrond stop
ジョブの登録
$ incrontab -e
[監視対象のファイル] [イベント] [実行するコマンド]
例
/home/www/test.ini.dev IN_MODIFY,IN_NO_LOOP /usr/bin/php /home/www/bin/test.php
解説
/home/www/test.ini.devを、
IN_MODIFY(編集)したら、
/usr/bin/php /home/www/bin/test.phpを実行
という意味
- イベントはカンマ区切りで複数指定が可能
- PATHなどの環境変数は一切反映されていないっぽい(なので、phpとかも/usr/bin/phpと書かないといけない)
- IN_NO_LOOPは、よくわかっていないが、実行するコマンドが完了するまで、イベント監視を無効にするというイベント。(これを指定しないとなぜか、2回目以降にイベントが実行されない)
マニュアルには、
「there is a symbol which doesn’t appear in the inotify symbol set. It it IN_NO_LOOP. This symbol disables monitoring events until the current one is completely handled (until its child process exits).」
検知可能なイベント
- IN_ACCESS
- File was accessed (read)
- IN_ATTRIB
- Metadata changed (permissions, timestamps, extended attributes, etc.)
- IN_CLOSE_WRITE
- File opened for writing was closed
- IN_CLOSE_NOWRITE
- File not opened for writing was closed
- IN_CREATE
- File/directory created in watched directory
- IN_DELETE
- File/directory deleted from watched directory
- IN_DELETE_SELF
- Watched file/directory was itself deleted
- IN_MODIFY
- File was modified
- IN_MOVE_SELF
- Watched file/directory was itself moved
- IN_MOVED_FROM
- File moved out of watched directory
- IN_MOVED_TO
- File moved into watched directory
- IN_OPEN
- File was opened
登録したジョブの反映
$ incrontab -d
これを実行しないと、登録したジョブが反映されないので、ご注意。
登録したジョブの確認
$ incrontab -l
ちなみに、登録したジョブは
/vat/spool/incron/以下にファイルとして保存されています。
$ ls -l /var/spool/incron/
合計 4
-rw------- 1 root www 131 4月 27 11:35 2015 www
ファイル名はジョブを登録したユーザ名になっているみたいです。
ログの確認
$ sudo tail -f /var/log/cron
cronのログと共有みたいです
こんな感じで表示されます。
Apr 27 11:35:09 ip-172-20-112-61 incrond[1248]: table for user www created, loading
Apr 27 11:35:09 ip-172-20-112-61 incrond[1248]: table for user www changed, reloading
Apr 27 11:36:11 ip-172-20-112-61 incrond[1248]: (www) CMD (/usr/bin/php /home/www/bin/test.php)
Apr 27 11:36:21 ip-172-20-112-61 incrond[1248]: (www) CMD (/usr/bin/php /home/www/bin/test.php)
まとめ
cronライクで設定できるのは楽。
一方で、結構古いプロダクトのわりに、あまりネットに情報がなかったりするので、調べるのに苦労します。なお、開発は今も継続しているみたいです。
本家
以上