Help us understand the problem. What is going on with this article?

CentOS 6.5にmonitをインストールしてプロセス監視をする

More than 3 years have passed since last update.

インストール

細かい監視などはzabbixでやるとして、障害発生時の自動復旧などを実施するためにmonitの設定をしました。

インストール
$ sudo yum -y install monit
$ rpm -q monit
monit-5.1.1-4.el6.x86_64
$ rpm -ql monit
/etc/logrotate.d/monit
/etc/monit.conf
/etc/monit.d
/etc/monit.d/logging
/etc/rc.d/init.d/monit
/usr/bin/monit
/usr/share/doc/monit-5.1.1
/usr/share/doc/monit-5.1.1/CHANGES.txt
/usr/share/doc/monit-5.1.1/COPYING
/usr/share/doc/monit-5.1.1/LICENSE
/usr/share/doc/monit-5.1.1/PLATFORMS
/usr/share/doc/monit-5.1.1/README
/usr/share/doc/monit-5.1.1/README.DEVELOPER
/usr/share/doc/monit-5.1.1/README.SSL
/usr/share/man/man1/monit.1.gz
/var/log/monit
$ monit -V
This is monit version 5.1.1
Copyright (C) 2000-2010 by Tildeslash Ltd. All Rights Reserved.

今回は余りバージョンなどは気にしなかったので、インストールされた5.1.1をこのまま使います。

初期設定

インストールされた設定の確認

デフォルトの設定ファイル類を眺めてみますが…

/etc/monit.conf
# set daemon mode timeout to 1 minute
set daemon 60
# Include all files from /etc/monit.d/
include /etc/monit.d/*
/etc/monit.d/logging
# log to monit.log
set logfile /var/log/monit
/etc/logrotate.d/monit
/var/log/monit {
    missingok
    notifempty
    size 100k
    create 0644 root root
    postrotate
        /sbin/service monit condrestart > /dev/null 2>&1 || :
    endscript

}

監視周期が60秒で、ログ出力のみ&ローテート設定ありの最低限の設定は出来ている様です。

メールでの通知機能などは使わないので、このまま使います。

プロセス監視の設定

/etc/monit.d/crond.rc
check process crond
    with pidfile "/var/run/crond.pid"
    start program "/etc/init.d/crond start"
    stop program "/etc/init.d/crond stop"

動作確認も兼ねて、とりあえずcrond辺りの設定を追加してみます。

monit設定確認
$ cd /etc/monit.d
$ sudo cp ~/monit.rc/crond.rc .
$ ls
crond.rc  logging
$ sudo service monit start
monit を起動中: monit: generated unique Monit id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and stored to '/root/.monit.id'
                                                          [  OK  ]
$ tail -f /var/log/monit &
[1] xxxx
[JST Jul dd hh:mm:ss] info     : monit: generated unique Monit id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and stored to '/root/.monit.id'
[JST Jul dd hh:mm:ss] info     : 'XXXXXXXXXX' Monit started
$ sudo service crond stop
$ [JST Jul dd hh:mm:ss] error    : 'crond' process is not running
[JST Jul dd hh:mm:ss] info     : 'crond' trying to restart
[JST Jul dd hh:mm:ss] info     : 'crond' start: /etc/init.d/crond
[JST Jul dd hh:mm:ss] info     : 'crond' process is running with pid xxxx
$ service crond status
crond (pid  xxxx) を実行中...

後は、時折ポート監視などの設定も追加しつつ、監視したいサービス(デーモン)単位で設定を追加していきます。

/etc/monit.d/sshd.rc
check process sshd
    with pidfile "/var/run/sshd.pid"
    start program "/etc/init.d/sshd start"
    stop program "/etc/init.d/sshd stop"
    if failed port 22 protocol ssh then restart
    if 5 restart within 5 cycles then timeout

※ここでポートは22にしていますが、実際にはポート番号は違う番号に換えているので適時書き換えて使用しています。

自動起動設定

適時動作確認をしつつ追加して、全てが終わったら、自動起動設定を入れておきます。

自動起動設定
$ sudo chkconfig --list monit
monit           0:off   1:off   2:off   3:off   4:off   5:off   6:off
$ sudo chkconfig monit on
$ sudo chkconfig --list monit
monit           0:off   1:off   2:on    3:on    4:on    5:on    6:off

ここでの自動起動は、OS再開時の設定なので、monit自身が異常終了した場合などは意味ないのですけどね(^_^;)
※inittabに入れた方が良いのかもしれないけど、inittab自体のメンテナンスを余りしたくないという…

追加設定

Webインタフェースでの動作確認

念のためのWebインタフェースも用意して動作確認をしておきます。

/etc/monit.d/monit-web.rc
set httpd port 2812 and address localhost
    allow   admin:password

2812番ポートをiptablesで開けるよりもnginxでproxyしちゃった方が早いかなぁという(^_^:)

/etc/nginx/conf.d/monit.conf
server {
    server_name monit.example.org;
    location / {
        proxy_pass http://127.0.0.1:2812;
    }
}

上記設定をnginxに追加して、アクセス確認をしておきました。

確認が終わったら、nginx側の設定は不要です。

CUIで確認
$ sudo monit status
The Monit daemon 5.1.1 uptime: 0m 
()
Process 'crond'
  status                            running
  monitoring status                 monitored
  pid                               1234
  parent pid                        1
  uptime                            24m 
  children                          0
  memory kilobytes                  1268
  memory kilobytes total            1268
  memory percent                    0.0%
  memory percent total              0.0%
  cpu percent                       0.0%
  cpu percent total                 0.0%
  data collected                    Sat Jul dd hh:mm:ss yyyy

System 'xxxx.example.org'
  status                            running
  monitoring status                 monitored
  load average                      [0.00] [0.00] [0.00]
  cpu                               -1.0%us -1.0%sy -1.0%wa
  memory usage                      475376 kB [25.4%]
  data collected                    Sat Jul dd hh:mm:ss yyyy
$ sudo monit unmonitor crond
$ sudo monit status
()
Process 'crond'
  status                            not monitored
  monitoring status                 not monitored
  data collected                    Sat Jul dd hh:mm:ss yyyy
$ sudo monit monitor crond
$ sudo monit status
()
Process 'crond'
  status                            initializing
  monitoring status                 initializing
  data collected                    Sat Jul dd hh:mm:ss yyyy
$ sudo monit status
()
Process 'crond'
  status                            running
  monitoring status                 monitored
  pid                               1234
  parent pid                        1
  uptime                            28m 
  children                          0
  memory kilobytes                  1268
  memory kilobytes total            1268
  memory percent                    0.0%
  memory percent total              0.0%
  cpu percent                       0.0%
  cpu percent total                 0.0%
  data collected                    Sat Jul dd hh:mm:ss yyyy

webインタフェースがあると、CUIからでも操作可能なのでメンテナンス時などに便利です。

zabbixでのmonitプロセス監視

ここまでで簡単な自動復旧の環境はできましたが、そもそもmonitが落ちてしまっていたらそれも叶わないので、monitについてはzabbix側でプロセス監視をしておきます。

アイテム設定

項目 設定
名前 Process monitor daemon running
タイプ Zabbixエージェント
キー proc.num[monit]
データ型 数値(整数)

トリガー設定

項目 設定
名前 Process monitor daemon down
条件式 {Zabbix server:proc.num[monit].last()}=0
深刻度 軽度の障害

上記のアイテム&トリガー追加をして、イザという時にはzabbix側で通知が出るようにしておきました。
深刻度は「警告」でも良いのですが、プロセス監視の本体側だし、monitそのものは自動起動しないので、「軽度の障害」にしておきました。

今後暇なときにでもmonitで監視しているプロセスの障害設定を追加しておこうと思っているのですが、それらの場合は「警告」にしようかなぁと思っています。

zabbixでのmonitログ監視

ついでに、何か障害があった場合(monitで自動復旧したとしても)についても、念のためzabbix側のイベントに出力するように設定しておきます。

アイテム設定

項目 設定
名前 Process monitor daemon log
タイプ Zabbixエージェント(アクティブ)
キー log[/var/log/monit,error]
データ型 ログ

トリガー設定

項目 設定
名前 Process monitor daemon error
条件式 (({Zabbix server:log[/var/log/monit,error].regexp(error)})#0)&({Zabbix server:log[/var/log/monit,error].nodata(300)}=0)
深刻度 警告

単純にerrorだけ引っかけて見れるようにすれば最低限かな…と。

cron停止時のエラーログ
$ tail -f /var/log/monit
[JST Jul dd hh:mm:ss] error    : 'crond' process is not running
[JST Jul dd hh:mm:ss] info     : 'crond' trying to restart
[JST Jul dd hh:mm:ss] info     : 'crond' start: /etc/init.d/crond
[JST Jul dd hh:mm:ss] info     : 'crond' process is running with pid xxxxx

この状態でzabbix側のイベントとして[JST Jul dd hh:mm:ss] error : 'crond' process is not runningが登録されるようになります。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした