指定したディレクトリ内のinotifyのファイルイベントを受けてプログラムを起動できるincronを使ってみました。今でもファイルの変更監視はポーリングしないといけない等と考えてる人もおられるようなのでメモ。
inotifyはLinuxのシステムコールレベルで監視対象のファイルの変更やアクセスを通知してくれる機能。これを使うと余分な負荷をさほどかけずに当該のファイルを監視できます。通知イベントは直ちに行われるので、あたかもその対象プログラムと同期したようなファイル処理などを容易に実装できます。
このincronはcronやinetdのようなinotifyのサーバとして動作し、指定されたディレクトリ内のファイルイベントを監視してプログラム起動を行ってくれます。
インストール
FedoraやCentOS等のrpm系では
yum install incron
Ubuntu/Debian等ではapt-getで。
apt-get install incron
使い方
/etc/incron.dに任意の名前で以下のような内容のファイルを作成します。編集用にincrontabコマンドがあります。
<PATH> <FS Event> <CommandLine>
例
/var/log IN_CLOSE_WRITE,IN_NO_LOOP logcheck $@/$#
$@がパス、$#がファイル名に置換されます。詳細は"man 5 incrontab"で。
問題というか
inotifyの機能をそのまま使っているようなので、再帰的な監視機能はありません。inotify-utilsのinotifywaitなんかにはちゃんと再帰的にディレクトリをたどっていってくれる機能があるのですが。
使い道
ログファイルの監視を行って、なにか出力されたらすぐに処理する。 例えばsshのログインを監視しておくとか。特にサーバでは他にもいろいろ使い道はありそうです。
開発ディレクトリをチェックしておき、更新したら自動でcheckinとかmakeするとか。上手く使えばDropboxもどきが簡単に実装できます。後は/etcを監視しておいて自動でバックアップとか。
個人的にはこのブログの更新を行ったらapacheのキャッシュ更新とか。
他には独立した処理プログラム同士を使ってカメラを使った監視と画像処理の組み合わせに使ったりとか組み込みにも負荷を増やさずに使えますね。