monit使う場合は定期的にmonit monitor allしたほうが良い

monitとは

サーバに常駐してプロセス監視(pid,file,tcp/udp port checkなど)を行い、必要ならプロセス再起動とかしてくれるめちゃ便利なデーモン。

で、公式の例のような感じでこんな風に設定してるとする。

check process apache with pidfile /usr/local/apache2/logs/httpd.pid
  group www
  start program = "/etc/init.d/httpd start"
  stop  program = "/etc/init.d/httpd stop"
  if failed host localhost port 80
    protocol HTTP request /monit/token then restart
  if 5 restarts within 5 cycles then timeout

monitがしてること

  1. http://localhost:80/monit/tokenにhttpリクエスト投げて、失敗(80番ポートに接続できない,40x/50xのstatusが返ってきたなど)すれば再起動(stop, start)する。
  2. 5サイクル内に5回再起動した場合はtimeout(unmonitor)

timeoutとなる例は、ネットワーク障害/アクセス集中による高負荷などで連続してモニタに失敗した場合など。で、こうなると、monit status*1のコマンド打ったときに

# monit status
(中略)
Process 'apache'
  status                            not monitored
  monitoring status                 not monitored
  data collected                    Sun Jul 19 18:54:17 2009

こうなっていて、以後apacheがモニタされなくなる。

対策

monit再起動(monit reloadではなく、停止/起動で)、monit monitor allなどのコマンドを実行する。でもうっかり忘れると困る。というわけでタイトルのようにcronで

*/30 * * * * /usr/sbin/monit monitor all

等のような設定を入れておいたほうが良いんじゃないか、と思ったのでこのエントリを書いた。

追記: set httpdについて

monit管理用のhttpdの設定。monit status, monit monitor allなどのコマンドを使う場合は、設定が必要。(monitの命令がhttp経由で実行されるので)
ここで設定するhttpdは通常のブラウザからでもアクセスできて、監視対象デーモンの再起動なども出来る。Basic認証で制限できるとはいえ、ブラウザ経由でそんなことするの怖い、というのであれば

set httpd port 2812 and use address localhost
  allow localhost   # Allow localhost to connect

というように設定しておけばlocalhostでのみlistenする。

リモートからアクセスする場合はIPとBasic認証かける。read-onlyの設定が入っているユーザは、statusを確認できるけどデーモン再起動などはできない。

set httpd port 2812 and use address localhost
  allow 192.168.0.1/24
  allow admin:Monit         # Allow Basic Auth
  allow user:pass read-only # Allow Basic Auth (read-only)

あと、sampleではhttpdのportが2812だけど、覚えにくいので自分が使うときは別のportに変えています(割とどうでもよい)。

ちなみにmonitのhttpdにアクセスするとこんな画面になる。

追記 monitor時のメール送信について

monit ver.5 からmonitor したときにメール飛んでくるようになったのでこのままではとてもうざいですね。メールの設定で

set alert address@example.com but not on { action }

などと書いておくとよいでしょう。

*1:monitの設定でset httpdを有効にしている必要あり