ファイルやディレクトリのイベントに応じてジョブを実行する – incron

kiccoCentOS, incron, incrond, incrontab, inotify, linux, イベント, ジョブ, ファイルシステム, 実行

こんにちは。kiccoです。
小倉競馬が終わってしまいました。小倉は逃げ・先行馬が非常に有利な競馬場です。
その特性を活かし一定の法則に従って馬券を購入したところ、回収率が180%を超えました。
次回の開催がめっさ楽しみです♪

さて今回は incron(inotify cron) の紹介です。
cron は指定した時刻に指定したプログラムを実行します。
incron は、特定のファイルまたはディレクトリのイベントを検知した際に指定したコマンドを実行してくれます。
例えば、/etc/hosts.allow が修正されたら指定アドレスにメールを送る、といった使い方ができます。

それでは実際に作業してみましょー。

作業は CentOS5 で行います。
# cat /etc/redhat-release
CentOS release 5 (Final)

Dagのリポジトリに incron のパッケージがありますのでそれを使います。

Dagのリポジトリ設定です。
# cat /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt

それでは incron をインストールします。
# yum install incron
<省略>
Installing:
incron i386 0.5.8-1.el5.rf dag 327 k
<省略>
Installed: incron.i386 0:0.5.8-1.el5.rf
Complete!

今回は細かい設定は省いてデフォルトのまま使ってみます。
# /etc/init.d/incrond start
Filesystem event daemon (incrond) を起動中: [ OK ]
# ps uax | grep [i]ncrond
root 1575 0.0 0.1 2900 580 ? Ss 17:44 0:00 incrond

これで使える状態になりました。
それではジョブを登録してみましょう。

cron の場合、ジョブの登録は crontab コマンドで行います。
incron の場合、incrontab コマンドで行います。わかり易くて良いですね(^ ^)b

incrontab の書式です。
監視対象ファイル/ディレクトリ名 イベント コマンド

‘t’オプションで指定できるイベントが確認できます。
# incrontab -t

主なイベントと説明です。

イベント名 説明
IN_ACCESS ファイルがアクセスされた
IN_MODIFY ファイルが修正された
IN_ATTRIB メタデータが変更された(permission、タイムスタンプ、UID、GID など)
IN_OPEN ファイルがオープンされた
IN_CREATE 監視対象ディレクトリ内でファイルやディレクトリが作成された
IN_CLOSE_WRITE 書き込みのためにオープンされたファイルがクローズされた
IN_CLOSE_NOWRITE 書き込み以外のためにオープンされたファイルがクローズされた
IN_CLOSE IN_CLOSE_WRITE と IN_CLOSE_NOWRITE の両方を対象
IN_DELETE 監視対象ディレクトリ内でファイルやディレクトリが削除された
IN_MOVED_FROM ファイルが監視対象ディレクトリ外へ移動された
IN_MOVED_TO ファイルが監視対象ディレクトリ内へ移動された
IN_MOVE IN_MOVED_FROM と IN_MOVED_TO の両方を対象
IN_ALL_EVENTS 全イベントを対象

それでは試しに以下のジョブを設定してみます。
 /etc/hosts.allow が修正されたら /var/log/messages にログを出力する

ジョブを登録します。
# incrontab -e
/etc/hosts.allow IN_MODIFY logger -t incron "hosts.allow modified."

ジョブを登録したらテーブルをリロードさせます。
# incrontab -d
requesting table reload for user 'root'...
request done

それでは登録したジョブが動作するかテストしてみましょう。
予め /var/log/messages を tail っておきます。
# tail -f /var/log/messages

/etc/hosts.allow を修正してみましょう。コメント行を追加してみます。
# date; echo "#" >> /etc/hosts.allow
2009年 3月 5日 木曜日 19:25:04 JST

/var/log/messages にログが出力されてます。
# tail -f /var/log/messages
Mar 5 19:25:04 casper incron: "hosts.allow modified."
(^-^)//””パチパチ

と、いったところで簡単ですが動作を確認できました。
次回はもう少し深く掘り下げてみます。

こちらのサイトを参考にさせて頂きました。
 Manpage of INOTIFY
 ファイル/ディレクトリの変更に応じて任意のジョブを実行するincron

それではまた(^o^)!