inotify でファイル監視しようず!

先日 @volpe_hd28v さんから inotify いいですよ!っていうお話を聞いたので早速メインで使用している Ubuntu 環境で使ってみます!
使用にあたっては次のページを参考にさせて頂きました!

ざっくり概要
  • インストール: sudo apt-get install inotify-tools
  • 使用: while inotifywait -r -e modify 監視対象; do したいこと(make とか); done

インストール

Ubuntu なら apt-get で OK!
sudo apt-get install inotify-tools


試してみる

今回は所定のディレクトリにある "app.coffee" というファイルに変更があった場合、そのディレクトリ上で "coffee app.coffee" を再実行(予め "coffee app.coffee" は実行中)というシナリオを実施してみます。

とりあえず "inotifywait -m" を確認。。。ふむふむ。(-m で継続実行)



別に modify イベント以外は要らないかねぇ。
特定のイベントのみハンドルするには "-e ハンドル対象のイベント名"


イベントを通知してくれるのはわかったけど、それを受け取って何らかのスクリプトを実行する方法がわからなかったので "man inotifywait" を確認。。。

EXAMPLES セクション発見!ふむふむ。。。
Example 2
A short shell script to efficiently wait for httpd-related log messages and do something appropriate.
#!/bin/sh
while inotifywait -e modify /var/log/messages; do
    if tail -n1 /var/log/messages | grep httpd; then
         kdialog --msgbox "Apache needs love!"
   fi
done
うーん、停止がからむと難しい。。。うまいこと出来なかった。。。一旦保留。。。
1, coffee 起動
2, inotifywait 起動
3, modify 検知
4, coffee 停止、再起動
5, 2 に戻る


再挑戦!!

上記の「試してみる」のお題では頓挫してしまいました。。。また今度。ステートの絡まないもう少し単純な次のシナリオに変更してみます。
  1.  該当のディレクトリ以下のファイルの変更を開始
  2. 変更を検知した場合、"cake build"を実施(make -a だっけ?に置き換えてもOK)


buildwhenchanged.sh の内容
#!/bin/sh
while inotifywait -e modify ./src; do
    cake build
done
(--help 見て気づいたけどディレクトリを監視するときは -r も付けないとサブディレクトリは見てくれないかも。。。)

実行。

成功!("succeed to build 'js/webCalc.js'" は"cake build"実行時のメッセージ)
 拍子抜けするほどあっさり行きました・・・。

これくらいの大きさならシェルスクリプトを作成しなくても、直接 "while inotifywait -e modify ./src; do cake build; done"みたいに打ってもいいかも。

まとめ

inotify で楽しようず!!

というか inotify じゃなくても、Ruby環境があるなら watchr とかもありますし、きっと探せば他にも同様のものはあるはずー


どうでもいいけど

bash で画面をクリアするには C-l もしくは clear コマンド(まだ bash です・・・)

コメント

  1. いいっすね!
    最近は Android の JNI 開発でも自動ビルド&エミュレータで自動テストで重宝してます。手放せません!
    volpe

    返信削除
  2. > volpe_hd28v さん
    情報ありがとうございました!!大変便利です!
    Android エミュレータでの自動テスト・・・気になります!

    返信削除

コメントを投稿

このブログの人気の投稿

「SQL実践入門」がとてもわかりやすい

PostgreSQLで多次元配列を1次元配列に展開したい