今日はプロセス監視ツールMonitで、自作のデーモンプログラムの死活監視と、死んじゃったら(+おかしくなったら)再起動してもらうという仕組みを構築する方法をご紹介したいと思います。
まず、自作プログラムですが、どこか適当なところに自分のプロセスIDを記録するファイル(pidファイル)を作ってもらう必要があります。今回作業したマシンはUbuntu Linuxでしたので、/var/run/hoge.pidのような感じで、プロセスIDを格納しただけのファイルを置いておきます。
Monitくんは、このファイルの場所を教えておき、このファイルに記録されているIDのプロセスが死んでいたり、メモリを以上に消費していたり、CPUを100%使っていたり、といった条件で再起動を行わせるよう設定できる便利ソフトです。
手順
Ubuntu Linuxにはパッケージ管理システムaptがあるので、以下のようにしてインストールできます。
$ sudo aptitude install monit
設定ファイルは/etc/monit/monitrcになります。以下のように書き換え+書いてやればokです。
# 最初の方の基本設定を書き換え
set daemon 120 # 120秒ごとに監視
set alert tomotaka@bpsinc.jp # アラートメールが飛ぶあて先
# (snip)
# 自分のデーモンの監視設定を追加
check process hogehoge
with pidfile "/var/run/hoge.pid"
start program = "/home/bps/bin/hoge.sh start"
stop program = "/home/bps/bin/hoge.sh stop"
if 2 restarts within 3 cycles then timeout
if totalmem > 100 Mb then alert
if cpu usage > 95% for 3 cycles then restart
それぞれの意味はなんとなくわかる通りです。起動コマンドはstart program, 停止コマンドはstop programで指定して、メモリを100MB以上消費していたらアラートを投げるなどといった細かい条件を設定できます。より細かい設定項目についてはMonitプロジェクトのドキュメントを見てみてください。
TCPによる接続がダメだったら、とかファイルのMD5チェックサムが変わっていたら、パーミッション、inode、タイムスタンプが変わっていたら、などさまざまな条件設定が可能です。
URLのチェックや、SIP、pingのチェックなども条件に設定できます。これはすごい。
とりあえず、自分のデーモンを監視させたいだけでしたらmonitrcにデフォルトで入っている他のデーモン監視設定は全部コメントアウトして、慣れてきたら少しずつコメントアウトをはずしていくのがオススメです。
設定が終わったらmonitを起動してあげましょう。
$ sudo /etc/init.d/monit start
自分のデーモンが死んでしまったら、ちゃんとmonitによって、再起動されるかどうか? psで自分が走らせているプロセスを見つけてkillコマンドで殺すと、うまくいっていれば、次にmonitがプロセスをチェックしたタイミングでアラートメールでmonitが再起動した旨を伝えてくれるはずです。
追伸
Apacheなどをmonitで監視するという例はよく見かけましたが、自分で作ったデーモンをmonitで監視させるという記事があまり(とくに日本語では)見つかりませんでしたので書いてみました。
デーモンのように、落としてはいけないプログラム
を自分ひとりでApacheやMySQLなどのたくさんの人がブラッシュアップしているクオリティに持っていくことは難しいです。
デーモンプログラムにもきちんと例外補足やロギングの仕組みを入れておけば、デバッグもしやすく、落ちにくいプログラムにしていくことが可能ですが、個人で実験できる量というのは24時間365日連続稼動時にアプリケーションが遭遇する無限の可能性の前では、残念ながら十分とは言えないでしょう。またテストのしすぎも費用対効果がよくない場合が多いかと思います。
それでも随時処理を行いたい場合には常駐型のプログラムを作成する必要があるわけで、そんな僕らこそ、Monitを使って可用性を確保するべきではないでしょうか。