blue_field

技術的なメモとか読書記録とかいろいろ(の予定

monitで簡単なプロセス監視

会社のサービスのサーバで動いてるプロセス(デーモン)を監視したかったので、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が復活できるようにしたり、という使い方で試している。

今は全く使っていないが、アラートメールを送信する機能などもある。シンプルな割にそれなりの機能を持っていて、結構細かい設定まで行える印象。突っ込んだ監視はできないが、導入ハードルがかなり低いのが良いなと思った。