CentOS - Monit でプロセス監視!

Updated:


不意にサーバプロセスが落ちてしまい、さらに、落ちたことにも気付かず何日も経過してしまう、ということがないよう、プロセスを監視するツール Monit を使用します。

以下、使用方法についての簡単な記録です。

0. 前提条件

  • CentOS 6.8(32bit) での作業を想定。
    (Debian 系はディレクトリ構成等が異なるので、適宜置き換えて考える)
  • RPMForge リポジトリが導入済みである。(過去記事参照: CentOS 6.5 - 初期設定!

1. monit のインストール

CentOS のデフォルトのリポジトリには存在しないため RPMForge リポジトリを使用してインストールする。

$ yum --enablerepo=rpmforge -y install monit

CentOS 7 系なら標準リポジトリでインストールできる(かもしれない)。

2. 設定ファイル編集

設定ファイル “/etc/monit.conf” を編集する。
以下は当方の例。

File: /etc/monit.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
set daemon 60                               # 監視間隔(秒)

set logfile /var/log/monit.log              # ログファイル

set idfile /var/monit/id                    # Monit インスタンスの ID ファイル

set statefile /var/monit/state              # Monitering ステート保存ファイル

set mailserver localhost                    # メールサーバ

set mail-format {                           # メール書式
     from: monit@$HOST
  subject: monit alert --  $EVENT $SERVICE
  message: $EVENT Service $SERVICE
        Date:        $DATE
        Action:      $ACTION
        Host:        $HOST
        Description: $DESCRIPTION

   Your faithful employee,
   Monit
}

set alert root@localhost                    # 通知先メールアドレス

include /etc/monit.d/*                      # 別の設定ファイル読み込み
  • set logfile /var/log/monit.logset logfile syslog facility log_daemon とすると syslog での出力となる。
  • メールサーバは複数設定可能。
  • メール通知先も複数設定可能。
  • set alert root@localhost only on { xxxx } などとすれば、xxxx アクション発生時のみメール通知するようにする。
  • set alert root@localhost but not on { xxxx } などとすれば、xxxx 以外のアクション発生時のみメール通知するようにする。
  • その他の設定等については、 “monit.conf” 内のコメントや公式ドキュメントを参照のこと。

3. アラート機能の設定

以下は MySQL サーバを監視する例。(パスは環境に合わせて適宜置き換えること)

File: /etc/monit.d/mysqld

1
2
3
4
5
6
7
8
9
10
11
12
13
check process mysql with pidfile /var/run/mysqld/mysqld.pid
    every 2 cycle
    start program = "/etc/rc.d/init.d/mysqld start"
    stop  program = "/etc/rc.d/init.d/mysqld stop"
    if failed
        host localhost port 3306 protocol mysql
        with timeout 15 seconds for 3 times within 4 cycles
    then restart$
    if failed
        unixsocket /var/lib/mysql/mysql.sock protocol mysql
        for 3 times within 4 cycles
    then restart$
    if 5 restarts within 5 cycles then timeout
  • “mysqld.pid” ファイルを2サイクル(今回の設定では 60秒 * 2 = 120秒)毎に監視し、存在しなければ MySQL サーバを再起動する。
  • TCP ポート 3306 への接続が4回中3回15秒のタイムアウトで失敗する場合は、 MySQL サーバを再起動する。
  • Unix ソケットへの接続が4回中3回失敗する場合は、 MySQL サーバを再起動する。
  • 5回中5回再起動となる場合は、タイムアウトする。
  • group xxxx としてグループ単位で監視の制御をすることも可能。
  • CPU 使用量やメモリ使用量等を監視することも可能。

PID ファイルの存在を監視するのではなく、プロセス自体の存在を監視したければ、1行目を以下のようにする。(以下は、プロセス名に hoge を含むプロセスを監視する例で、正規表現で指定する)

File: /etc/monit.d/hoge

1
check process hoge matching "hoge"

4. 構文チェック

予め設定ファイルの構文をチェックすることができる。

$ monit -t
Control file syntax OK

5. Monit の起動

$ /etc/rc.d/init.d/monit start
Starting monit: Starting monit daemon with http interface at [localhost:2812]
                                                           [  OK  ]

6. 監視状況の確認

$ monit status
The Monit daemon 5.5 uptime: 5m

Process 'mysql'
  status                            Running
  monitoring status                 Monitored
  pid                               14542
  parent pid                        13372
  uptime                            9h 18m
  children                          0
  memory kilobytes                  863204
  memory kilobytes total            863204
  memory percent                    44.7%
  memory percent total              44.7%
  cpu percent                       1.3%
  cpu percent total                 1.3%
  unix socket response time         0.001s to /var/lib/mysql/mysql.sock [MYSQL]
  port response time                0.001s to localhost:3306 [MYSQL via TCP]
  data collected                    Sun, 09 Oct 2016 23:31:18

System 'foo.bar.buz'
  status                            Running
  monitoring status                 Monitored
  load average                      [0.42] [0.38] [0.38]
  cpu                               12.9%us 1.7%sy 14.2%wa
  memory usage                      1807708 kB [93.6%]
  swap usage                        889344 kB [21.2%]
  data collected                    Sun, 09 Oct 2016 23:31:18

statusRunning であれば、「監視中」である。

monit summary だと status だけを確認できる。

7. 個別監視の停止・起動

個別に監視を停止・起動するには以下のようにする。

$ monit xxxx stop
$ monit xxxx start

8. グループ単位での監視の停止・起動

個別の設定ファイル内で group xxxx のように記述していれば、xxxx グループの単位で監視を停止・起動することができる。

$ monit -g xxxx stop
$ monit -g xxxx start

9. 参考サイト


プロセスが落ちていないかをチェックするためにシェルスクリプトを作成する必要がないので、手軽で便利です。

以上。





 

Sponsored Link

 

Comments