オフィシャルサイト
http://www.tildeslash.com/monit/

MONIT

MONITは、デーモン監視プログラム。異常をきたしたサービスを自動的に再起動したり、そうした異常をメールで通知させたりできる。WEBインターフェースも内蔵しており、他ホスト上のブラウザからデーモンの状態確認や手動での停止/起動も可能。バージョン 4 からは、パーティションの使用状況など、デバイスの監視も可能となった。同じような目的のプログラムとしては daemontoolsWebmin が一般的だが、それらが粘着質すぎるとかウザッタいと感じたならば、シンプルで素直な MONIT を利用してみてはいかがだろうか。

注意事項:

Table of Contents

インストール

RedHat系 OS を使っているのなら、SPECファイルも寄稿されているので、手動よりも、RPMパッケージとしてビルドしてかインストールすることをお勧めする。

PostgreSQLパッチ

[2006/5/3: 私の書いたこのプロトコルテストは MONIT 4.8 から正式採用された。何かの理由で 4.7 以前の MONIT を使い続ける必要でもない限り、 4.8 以降をインストールすれば、このパッチは必要ない。やっと少し、GNU 界に恩返しができた。]

バージョン4.7 まで、MONIT は mysql 用のコネクションテストモジュールは備えているが、 PostgreSQL 用は装備していなかった。MONIT の汎用テストを使ってみたところ、PostgreSQL のログに `incomplete startup packet' という警告がインターバル毎 (つまり標準では 2 分毎!) に残るので、とても使えない。(mysql では以前、これによる `too many errors' が原因でロックがかかって接続を受け付けなくなってしまうという実害があったようだ。) これは、MONIT の汎用コネクションテストが、 PostgreSQL のポート (またはUNIXソケット) に向かって PGSQLプロトコルとは関係のない汎用的なコードを送り、ぶっきらぼうにソケットを閉じるからだ。 PostgreSQL にとっては「ワン切り」の電話が 2 分ごとにかかってくるようなもので、たまったものではない。

そこで筆者は PostgreSQL 用サービステストを書いた。

monit-4.7-pgsql.diff

パッチにしてあるので、RPMをビルドする場合でも MONIT のソースアーカイブを一旦解凍して (パッチを MONIT ソースディレクトリのひとつ上に置いてあるとする);

user$ cd monit-4.7
user$ patch -p1 < ../monit-4.7-pgsql.diff

RPMをビルドする場合には、パッチの当たったソースを再度アーカイブにまとめて (tar czvf monit-4.7.tar.gz monit-4.7/) からビルドする。パッチは以下の環境で作成、テストした;

実際の使い方は 被制御デーモンの登録 のセクションにまとめた。

テストコードを書いてみて分かったのだが、MONIT チームは新しいコネクションテストを作りやすいように下地を用意してくれていた。 MONIT ソースの protocols ディレクトリにある NOTES テキストファイルに組み込み方の概略説明もある。あとは目的のプロトコルの仕様を調べ etherealtcpdump で実際に聞き取ったパケットを分析すれば、何とかコードが書けるだろう。既存のプロトコルテストコードも参考になった。
ちなみに、MONIT の汎用性や安定性を損なわないために、 MONIT 開発チームは固有のライブラリとのリンクを最低限にしようと常に留意している。例えば PGSQL テストも libpq をリンクさせて書く方法もあったが、結果的には MONIT の備えるファンクションだけを使うようにコードが書けて良かったと思っている。

手動でのインストール

configure のオプション

ソースに付属する configure スクリプトによって Makefile を用意する。

root# ./configure option
configure で指定したほうがよいオプション
--sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man

コンパイルとインストール

root# make
root# make install

初めてのインストールなら、 サンプルの MONIT 主設定ファイルをシステム設定ディレクトリにコピー:

root# cp monitrc /etc
root# chmod 600 /etc/monitrc

MONIT は起動時に設定ファイルのオーナーをチェックしており、グループとオーナー以外に読めるパーミション (644など) になっていると、起動しない。また、設定ファイルのオーナーのみが、そのファイルに書かれたサービスをコントロールできる仕組み。

RPMパッケージをビルドする

MONIT 4.8 からはオリジナルのソースに SPEC ファイルが同梱され、単に `rpmbuild -tb monit-x.x.tar.gz' とするだけでも RPM パッケージがビルドできるようになった。しかし検討の結果、 Dag の SPEC ファイルの方がよく作り込まれている (依存性チェックの定義など) ので、以下の手順をお勧めする。

MONIT には Dag Wieers の寄稿した RPM バイナリパッケージもある。ビルド済みのパッケージをお仕着せで使うのもいいが、RPM ビルドの情報ファイルである SPEC ファイル単体も公開してくれているので、せっかくだから自分でビルドしよう。そうすれば、独自の変更/拡張を加えてからビルドすることも可能だし、人頼みをせずに MONIT 自体のアップデートにもいち早く追従できる。やり方を示そう。

SPECファイルの確認と修正

Dag Wieers のページから monit.spec ファイルをダウンロード。

RPMビルドしてインストールする場合には、各種 PATH は rpmbuild が面倒を見てくれるため、 手動で configure とビルドを行う場合とはパスが少し異なるという点に注意。SPECファイルを改変すれば手動インストールした時と同じにすることも可能だと思うが、敢えてそうするだけの意味もないだろう。 Fedora Core 上で Dag の monit.spec を使った場合の PATH を以下に示す;

sysconfdir=/etc
localstatedir=/var
mandir=/usr/share/man

monit
=/usr/bin/monit

必ず編集しなくてはならないのは、 monit.spec の冒頭近くにある
Version: x.x
のところ。 x.x を、これからパッケージングする MONIT のバージョンに合わせて書き換えないとビルドできない。

さらに、几帳面な人は
Release: 1
などとなっている部分を
Release: 1.FC4
のようにプラットフォームなどを加えたものに書き換えておくと、ビルドされるパッケージファイル名とパッケージ情報が正確になって良い。

また、この SPEC ファイルには rcスクリプトもインラインで含まれているので、変えたいところがあれば変えておき、満足のいくものができたら、しっかりと蔵にしまっておこう。 MONIT に同梱されている contrib/rc.monit は使用されない。

monit設定ファイルの名前について

趣向の問題に近いのだが、DAG の SPECファイルで気に入らない点がひとつある。 DAG は MONIT設定ファイルの名前を、標準の /etc/monitrc から、 RedHat的に /etc/monit.conf に変える仕組みを採っているのだ。以前は、その SPECファイルで rpmbuild しても MONIT は相変わらず monitrc を探しに行ってしまい、 monit の起動時には必ず -c <control_file> を渡さなくてはならなくなるという問題があった。この点は SPEC ファイルバージョン 4.8.1-3 で対処されたが、ソースの contribディレクトリにあるツールを使う場合をはじめ、不都合も出てくる。そこまでして .conf にこだわる必要があるのだろうか。

そこで私は、その点でも SPECファイルを修正することにしている。具体的には、SPECファイルの中に出てくる monit.conf という文字列を全て monitrc に変える。また、 SPEC バージョン 4.8.1-3 以降では、 monitソースの monitor.h ファイル内の文字列置換処理 (前述の問題への対策) が追加されているので、その行;

%{__perl} -pi.orig -e 's|\bmonitrc\b|monit.conf|' monitor.h

も削除する必要がある。

ソースの配置とビルド

MONIT のオフィシャルページからソースアーカイブ monit-x.x.tar.gz をダウンロードし、root に成ってからそれを /usr/src/redhat/SOURCES/ にコピーする。解凍する必要はない。また、先ほど調整した monit.spec/usr/src/redhat/SPECS/ にコピーする。そうしたらいよいよ rpmbuild の出番だ。 -bb オプションでバイナリのみをビルドする。 --clean オプションは、ビルド完了後に、ビルドの過程で BUILD/<arch>/ 下に展開されたソースファイルを削除させるためで、どうしても必要というわけではない。 (あとで別途 `rpmbuild --clean SPECS/monit.spec' とコマンドしてクリーンナップを行うこともできる。)

root# cd /usr/src/redhat
root# rpmbuild -bb --clean SPECS/monit.spec

これだけで、 monit.spec の設定に従って configure, make 及び RPMパッケージの作成まで行われる。

インストール前に、以前に手動コンパイルした monit がインストールされているのなら、最低限 /usr/local/bin/monit だけでも削除しておこう。 PATH 上にふたつもあるとトラブルの元になりかねない。あとは RPMS/<arch>/ 下に完成した monit-x.x.<arch>.rpm を通常の RPM パッケージ同様にインストールするだけだ。 Dag の SPEC 仕様により、/etc/init.d/monit は必ず置き換えられるが、サンプルの /etc/monitrc は既に同名のファイルが存在する場合はインストールされない。以前と大幅にバージョンが違う場合にはあらかじめ monitrc.old などへリネームしておくことをお勧めする。

MONIT起動スクリプト

ソースを手動でインストールした場合には、ソースの contrib ディレクトリに MONIT 起動スクリプトのサンプルがあるのでそれを利用すると良い。 RPMをビルドしてからインストールした場合には、インストールの際に自動的にコピーされるためこの手順は必要ない。

root# cp contrib/rc.monit /etc/rc.d/init.d/monit
root# chmod 755 /etc/rc.d/init.d/monit

MONIT起動スクリプトの修正 (手動コンパイルの場合のみ)

ソースに添付されている起動スクリプトは、バージョンによっては幾つか問題があるので修正する。 Dag の SPEC ファイルに含まれる起動スクリプトは特に問題はない。まず、なぜか monit バイナリの位置がデフォルトインストールパスとは違っているので修正;

MONIT=/usr/local/bin/monit

起動条件のチェックを修正。
1行目: monit バイナリファイルに実行可能ビットが立っているかのテストに変更。
2行目: 設定ファイルの存在を確認するテストを加える。

[ -x $MONIT ] || exit 0
[ -f $MONITRC ] || exit 0

reload セクションの記述は、 monitrc のリロード時にロックファイルを削除していておかしいので修正:

[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/monit <--この 1行を削除

また、 initscripts (rpm) のバージョンが古い場合は、start と reload の部分の "--force" を取り除くとともに、stop 部分は書き換える (下記) 必要がある。RedHat 7.2では要変更、Feroda core 1 以降では変更不要だった。これは、古い /etc/rc.d/init.d/functions スクリプトでは daemon ファンクションに "--force" というオプションが定義されていないため。どのバージョンの initscripts から変わったかは定かでない。

変更前のstop部分:

daemon --force $MONIT -c $MONITRC quit 

変更後:

killproc monit

自分好みに書き換えた /etc/rc.d/init.d/monitこれ (やや古い)。