Glide Note

glidenote's blog

ファイル/ディレクトリの変更を検知してコマンドを実行するincron

webistranoでファイルをデプロイして、設定の再読み込みやサービス再起動などが必要な際に、 デプロイユーザがsudoreloadやらrestartなどを実行しているのが、 権限的に何となく気になって、ファイルの更新を検知して 自動的にreloadrestartする方法を模索していたら incronという良い物があったので検証。

検証環境はScientific Linux 6.2です。

実現したいこと

  • デプロイユーザとサービス再起動ユーザの分離(sudo権限の剥奪)
  • Nagiosの設定ファイルをデプロイしたら、Nagiosのreloadが自動でかかる
  • Passengerのrestart.txt的な感じでreload.txtがトリガーでNagiosのreload的な

incronの導入

incronをyumで導入

1
sudo yum -y install incron

incronの起動

1
2
sudo service incrond start
sudo chkconfig incrond on

incrontabの設定

crontabと同じような感じで設定。今回はrootのincrontabを設定します。

1
sudo incrontab -e

下記のように監視対象,トリガー,実行コマンドという形で記載

1
/var/webistrano/nagios/reload.txt IN_ACCESS,IN_MODIFY,IN_ATTRIB service nagios reload

reload.txtへのアクセス、修正などのイベントを検知し、nagiosreloadが走るようにする。 実際にはデプロイの際に、reload.txttouchなどでタイムスタンプを更新して、reloadを走らせます。 (実運用ではconfigtestをかけ成功した場合にreloadするようなスクリプトを用意した方が良いです)

incrontab -dで設定の反映

1
sudo incrontab -d

トリガーとなるイベント一覧

incrontab -tでイベントとなるトリガー一覧が確認出来ます。

  • IN_ACCESS : 当該ファイルがアクセスされた
  • IN_MODIFY : 当該ファイルが変更された
  • IN_ATTRIB : メタデータが変更された(パーミッション、拡張属性、タイムスタンプなど)
  • IN_CLOSE_WRITE : 書き込み可能ファイルの1つが閉じられた
  • IN_CLOSE_NOWRITE : 書き込み不可能ファイルの1つが閉じられた
  • IN_OPEN : ファイルの1つが開かれた
  • IN_MOVED_FROM : 当該ディレクトリの外にファイルが出された
  • IN_MOVED_TO : 当該ディレクトリの中にファイルが入れられた
  • IN_CREATE : 当該ディレクトリ中にファイル/ディレクトリが新規作成された
  • IN_DELETE : 当該ディレクトリ中からファイル/ディレクトリが削除された
  • IN_DELETE_SELF : 当該ファイル/ディレクトリ本体が削除された
  • IN_CLOSE : IN_CLOSE_WRITEとIN_CLOSE_NOWRITEの双方を対象とする
  • IN_MOVE : IN_MOVED_FROMとIN_MOVED_TOの双方を対象とする
  • IN_ALL_EVENTS : ここに一覧した全イベントを対象とする
  • IN_DONT_FOLLOW : シンボリックリンクは参照させない
  • IN_ONLYDIR : 当該パスがディレクトリの場合のみ監視させる
  • IN_MOVE_SELF : 当該ファイル/ディレクトリ本体が移動された

デプロイユーザが下記のようにデプロイ後にreload.txtのタイムスタンプを 更新するとnagiosreloadがかかるようになり、sudoの必要がなくなった。

1
touch /var/webistrano/nagios/reload.txt

同じようなことはwatchrでも出来ますかね。

ファイルの変更を動的に検知して、反映させる場合とかで便利そう。使いどころも結構ありそう。

参考URL

Comments