2009年6月9日火曜日

cron で サービス監視ワンライナー

linuxやUNIXサーバで、取り合えず起動していて欲しいサービスがある場合。
堅くやりたければ daemontools や monitやらを使い、nagiosなどで外部から監視させたい。
 
そこまで不要だけどとりあえず、って時は cron にやらせるのも手軽でアリ。
nagios プラグインと組み合わせることで意外と柔軟な設定もできる。
 
 

では linux版、pidofを使ってみる。
*/10 * * * * root /sbin/pidof hoge > /dev/null || /sbin/service hoge start
 

たとえばこんなの。10分おきにpidof を叩いて、正常終了しなかったら実行の "||" を使って エラーがあれば通知(デフォルトならroot宛)もしてくれる。
 
 


ちょっと応用して、Nagios の check_procs プラグインを使ってプロセスの状態による動作設定をしてみる。

# /usr/local/nagios/libexec/check_procs -w 1:10 -a 'httpd'
PROCS OK: 9 processes with args 'httpd'


check_procs の結果コードは 正常終了が0・Warningが1を返すので、そのまま "&&" や "||" に渡せばOK。
例ではhttpd のプロセス数が 1から10 の間に入ってないとWarning だ。
 
 

ほかにも、check_http で応答が悪かったら、再起動するなり止めるなりするという使い方もできそうだ。
(止める場合は、適当にsleep コマンドをはさんで再開なども)
 

Solarisでも使える、(check_procはコンフィグオプションがややこしいが動作はする)、その場合は service を svcadmに変えればよい。
 
 

で、用があるので IRCプロキシの tiarra を監視した。
*/15 * * * * root /usr/local/nagios/libexec/check_procs -w 1:5 -a 'tiarra' >/dev/null || /usr/bin/screen -d -m /usr/l
ocal/tiarra/tiarra --config=/usr/local/tiarra/tiarra.conf

 

tiarra は daemon で動かしたかったんだけど、制御端末からうまく切り離せなかったので断念。 daemon 関数で普通に呼ぶだけじゃ無理なんかな?
 
ってことで、15分おきに tiarra 関連プロセス数が 1-5 の間にあるかチェック、無かったらscreen のデタッチ退却モードで tiarra を動作させるという仕組みで作成。
 

軽くテストはしたので多分動くと思うが、、まだ事故でtiarraが止まってないのでどうなるか。
 
 

プラグインでなくても、「ps -eo 'comm args」の出力辺りから何とかできないかなあ。