Posted at

incronを使ってみた

More than 3 years have passed since last update.


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ライクで設定できるのは楽。

一方で、結構古いプロダクトのわりに、あまりネットに情報がなかったりするので、調べるのに苦労します。なお、開発は今も継続しているみたいです。


本家

http://inotify.aiken.cz/?section=common&page=home&lang=en

以上