« Q4M 0.9 released | Main | blockdiff を使ったお手軽ホットバックアップ環境の構築 (Linux, MySQL, etc.) »

January 14, 2010

crontab を使って効率的にサービス監視する方法

監視とは継続的なテストである、という話 (もしくは cronlog とテストスクリプトを組み合わせた監視手法について)に続きます

 今日ようやく、積ん読状態だった「Software Design 2010年1月号」を手に取ったのですが、特集が「今日から使えるスクリプト満載! [プロ直伝]お手軽サーバ監視術」。興味深く拝読したのですが、もっと楽ができるのにと思うところも。ちょうど、昨年末に運用しているサービス「パストラック」のサーバを移転し、crontab と perl で書かれたスクリプト群を使った監視環境を構築したところなので、そこで使っているスクリプト cronlog を紹介したいと思います。

 特集の前書きにも書かれていることですが、サーバやネットワーク機器が多数ある環境なら、Nagios を始めとする、専ら監視のために作られたソフトウェアを使って、監視システムを構築すべきです。逆に小規模な環境で crontab やスクリプトを監視に使うメリットがあるとしたら、それは、極力覚えることや必要な設定を減らせる、という点でしょう。

 監視項目毎にスクリプトを書くなんて面倒でやってられません。そこで cronlog! cronlog を使うことで、既存のコマンドを crontab を使った監視系に早変わりさせることができます。

 cronlog は、引数として与えられたコマンドを起動し、その終了コードが非ゼロであった場合に、コマンドの出力結果 (stdout と stderr) を標準出力にプリントするコマンドです。何を言っているか良くわからないかもしれませんが、cronlog を使うと、たとえば ping によるサーバ監視は crontab に以下のように書くことで可能となります。

MAILTO=alert@example.com
5 * * * * cronlog -- ping -n 5 my-server 2>&1

 この crontab を解説すると、次のようになります。ping コマンドの終了コードは、応答が返ってきた場合 0、返ってこない場合に 1 です。cronlog は終了コードが非ゼロの場合のみ、実行されたコマンド (ここでは ping) の出力結果を出力、つまり ping がエラーを返した場合にのみ、その内容を cron に受け渡すことになります。cron は何か出力を受け取ると MAILTO に指定されたアドレスに、その内容をメールとして送信します。以上をまとめると、ping 応答が返ってこなかった場合にエラーメッセージを送信するという処理が、上の1行で実現できていることが分かると思います。

 これなら、監視項目ごとにスクリプトを書かなくてもいいので簡単です。

 ping のかわりに HTTP の監視をしたいのなら、

5 * * * * cronlog -- wget -O - http://my-server 2>&1

と書けば OK です。あるいは、ping 監視に成功した場合のみ HTTP 監視を行う、というようなマニアックな処理も、

5 * * * * cronlog -- ping -n 5 my-server 2>&1 && cronlog -- wget -O - http://my-server 2>&1

とすることで実現できます。監視項目が大量にあったり、ワンライナーで書きたくない場合は、スクリプトを書いて、それを cronlog で呼び出せばいいのです。注意すべきは唯一、障害を検知した場合は、非ゼロの値で exit すること。このへんも小技があるのですが、それはさておき。

 cronlog には、ログをファイルに保存したり、ログの各行にタイムスタンプを挿入するオプションもあります (というか、cronで実行するタスクのログを保存しつつ、タスクがエラーを返したらメールを送信する、というのが本来の機能です。監視=副作用のないタスク、なだけ)。詳しくは man cronlog をご覧ください。

PS. cronlog はオレオレ監視スクリプト群 kaztools の一部です。インストール方法は github.com/kazuho/kaztools からダウンロードしてきて perl Makefile.PL && make && make test && make install。興味のある方はどうぞ。

TrackBack

TrackBack URL for this entry:
http://bb.lekumo.jp/t/trackback/404050/22912795

Listed below are links to weblogs that reference crontab を使って効率的にサービス監視する方法:

Comments

cronlog使わなくてもcronもメール通知機能ありますよね。
スクリプトも呼び出せるし。
ログも吐いてくれてるし。

> cronlog使わなくてもcronもメール通知機能ありますよね。

えぇ。ですから、cronlog は cron のメール通知機能を使っています。
cronlog は、多くの cron タスクで求められる、以下のことをさくっと書くために作りました。

- タスクが異常終了した場合に (のみ)、タスクの出力を (cron が) メール送信
- タスクの出力を個別のファイルに (各行にタイムスタンプをつけながら) 保存

いずれも cron 本体にはない機能だと思いますが、私の不勉強ならご指摘いただければ。

> - タスクが異常終了した場合に (のみ)、タスクの出力を (cron が) メール送信

下記のような方法もあるようです。

標準エラー(STDERR)のみアラートメールする
http://tm.root-n.com/unix:cron:stderr2mail

roo さん、コメントありがとうございます。

"> /dev/null" しちゃうと、stderr に出力があった場合に、stderr の内容だけがメールに届くようになるわけですが、それだと運用が難しいな、というのが自分の考えです。

例えば、例に挙げている ping はエラーを返す場合でも、標準エラー出力には何も出力してくれません (なので || echo "ping error" とか書かざるを得ない)。

何が原因なのか分かりやすくする意味でも、エラーがあった場合に標準出力も含めて確認できる、というのが、(監視に限らず)crontab のタスクを書く上で重要だと思います。

Post a comment