incron

incronを使ってみた

More than 1 year has 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

以上