monitで簡単なプロセス監視
会社のサービスのサーバで動いてるプロセス(デーモン)を監視したかったので、monitをお試し導入した。その際のメモ。
Monit is a small Open Source utility for managing and monitoring Unix systems. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.
ふむふむ。さらに、
Up and running in 15 minutes!
と書いてある。手っ取り早くプロセス監視を行う手段としては良さそう。
インストール
インストールするサーバは、Amazon EC2 (Amazon Linux)。
yum
でインストール可能。
プロビジョニングツールとして最近はItamaeを利用しているので、レシピを書く。
# recipes/monit.rb package "monit" service "monit" do action %i(enable start) end
とりあえずこんな感じでItamaeを実行し、monit
自身を動かす。
$ monit -V This is Monit version 5.2.5 Copyright (C) 2000-2011 Tildeslash Ltd. All Rights Reserved.
デフォルトの設定
以下のデフォルト設定ファイルをチェック。
/etc/monit.conf
/etc/monit.d/logging
/etc/logrotate.d
共通設定
ほとんどコメントアウトされている。
# /etc/monit.conf set daemon 60 include /etc/monit.d/*
set daemon
はmoitの監視周期。60秒に1回、プロセスが生きてるかチェックしてくれる。
各プロセス固有の設定ファイルは、/etc/monit.d/
以下に書いていけば良さそう。
ログ
# /etc/monit.d/logging set logfile /var/log/monit
# /etc/logrotate.d/monit /var/log/monit { missingok notifempty size 100k create 0644 root root postrotate /usr/bin/pkill -HUP -U root -x monit > /dev/null 2>&1 || : endscript }
set logfile
でログの出力先を設定 (/var/log/monit
)、ログローテートもとりあえずやってくれそうなのでこのままで。
monitコマンド
monit
コマンドが使えるようになっている。monit -h
でコマンドやオプションが見れる。
例えば、monit summary
で死活監視中のプロセスが見れたり、monit monitor all
で設定したプロセスの監視を開始(再開)できたり。
これらのコマンドを実行した際、デフォルトの設定のままだとエラーが出てしまった。
# monit summary monit: error connecting to the monit daemon
回避するため、下記のように設定を/etc/monit.conf
に追記した。
# recipes/monit.rb execute "Update base setting" do user "root" command <<-EOC sudo sh << SCRIPT cat >>/etc/monit.conf <<'EOF'; set httpd port 2812 and allow localhost EOF SCRIPT EOC not_if "grep '^set httpd port 2812 and$' /etc/monit.conf" notifies :reload, "service[monit]" end
参考: monit: error connecting to the monit daemon - BTT's blog
# monit summary The Monit daemon 5.2.5 uptime: 23m System 'system_hogehoge' running
redisを監視
試しにredis
を監視してみる。
設定
redis
用の設定ファイルを作成。こちらもItamaeで。
# recipes/monit.rb template "/etc/monit.d/redis.conf" do mode "644" owner "root" group "root" source "../templates/monit/redis.erb" notifies :reload, "service[monit]" end
# templates/monit/redis.erb check process redis with pidfile /var/run/redis/redis.pid start program = "/etc/init.d/redis start" stop program = "/etc/init.d/redis start" if 5 restarts within 5 cycles then timeout
/etc/monit.d/redis.conf
に、check process ..
以下の設定を書き込む。
あんまり見やすくないんだけど、設定の記法のドキュメントがある。 http://mmonit.com/monit/documentation/monit.html
- 1行目の
check process
で、監視対象のプロセスのpidファイルを指定。 - 2, 3行目の
start program
,stop program
で、起動・停止のプログラムを記述。特に何も指定しないとrootユーザーで実行される。ユーザーやグループを指定するときは、start program = "/etc/init.d/redis start" as uid Yusuke and gid Yusuke
と書く。 - 4行目の
if
文で、特定条件の時のmonitの挙動を指定できる。この場合は、5回の監視中にredis
が5回再起動を試みると、timeoutアラートを出してmonitは監視をストップする。
if
文が便利そう。
if totalmem is greater than 300MB for 10 cycles then restart
例えば上記のように、10回の監視全てにおいてメモリ使用量が300MBを超えていたら再起動、みたいな使い方もできる。
テスト
monitがちゃんと機能するか試す。
sudo service redis stop
でRedisをストップさせると、monitのログに出力が。
自動で再起動を行っているのが分かる。
# /var/log/monit [JST Mar 31 13:52:41] error : 'redis' process is not running [JST Mar 31 13:52:41] info : 'redis' trying to restart [JST Mar 31 13:52:41] info : 'redis' start: /etc/init.d/redis [JST Mar 31 13:53:42] info : 'redis' process is running with pid 31814
確認してみると、ちゃんと動いてる。
$ sudo service redis status redis-server (pid 31814) is running...
先に述べたとおり、何らかの問題があってこの再起動が5回連続で失敗したら、monitは監視をやめてしまう設定になっている。そういった時に監視を再開させるのが、monit monitor all
もしくは`monit monitor <process_name>'。
おわり
以上、monitの簡単な導入の備忘録。
会社では、resque
を監視させて非同期処理が滞らないようにしたり、OOMキラーさんがやってきてもsshd
が復活できるようにしたり、という使い方で試している。
今は全く使っていないが、アラートメールを送信する機能などもある。シンプルな割にそれなりの機能を持っていて、結構細かい設定まで行える印象。突っ込んだ監視はできないが、導入ハードルがかなり低いのが良いなと思った。