Monit プロセス監視と自動再起動 †
check programでパラメータを与える †
新しいmonitに更新 †
- CentOS 7 EPEL repo: monit-5.14
- logrotate有り。RHEL6/7で設定ファイル名が異なる
# RHEL 7
rpm -ql monit
...
/etc/logrotate.d/monit
/etc/monit.d
/etc/monit.d/logging
/etc/monitrc
/usr/bin/monit
/usr/lib/systemd/system/monit.service
/usr/share/doc/monit-5.14
/usr/share/doc/monit-5.14/COPYING
/usr/share/doc/monit-5.14/README
/usr/share/man/man1/monit.1.gz
/var/log/monit.log
# RHEL 6
rpm -qlpi monit-5.25.1-1.el6.x86_64.rpm
...
/etc/monit.conf
/etc/monit.d
/etc/rc.d/init.d/monit
/usr/bin/monit
/usr/share/doc/monit-5.25.1
/usr/share/doc/monit-5.25.1/COPYING
/usr/share/doc/monit-5.25.1/README
/usr/share/man/man1/monit.1.gz
/var/lib/monit
/var/monit
# RHEL 7
rpm -qlpi monit-5.25.1-1.el7.centos.x86_64.rpm
...
/etc/monit.conf
/etc/monit.d
/usr/bin/monit
/usr/lib/systemd/system/monit.service
/usr/share/doc/monit-5.25.1
/usr/share/doc/monit-5.25.1/COPYING
/usr/share/doc/monit-5.25.1/README
/usr/share/man/man1/monit.1.gz
/var/lib/monit
/var/monit
# EHEL 6
rpm -qlpi monit-5.25.1-1.el6.x86_64.rpm
...
/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.25.1
/usr/share/doc/monit-5.25.1/COPYING
/usr/share/doc/monit-5.25.1/README
/usr/share/man/man1/monit.1.gz
/var/log/monit
# EHEL 7
rpm -qlpi monit-5.25.1-1.el7.x86_64.rpm
...
/etc/logrotate.d/monit
/etc/monit.d
/etc/monit.d/logging
/etc/monitrc
/usr/bin/monit
/usr/lib/systemd/system/monit.service
/usr/share/doc/monit-5.25.1
/usr/share/doc/monit-5.25.1/COPYING
/usr/share/doc/monit-5.25.1/README
/usr/share/man/man1/monit.1.gz
/var/log/monit.log
- 環境
- Ubuntu 12.04 LTS / monit 5.3.2がインストール済み
# 古いバージョンを待避
which monit
/usr/bin/monit
sudo service monit stop
sudo mv /usr/bin/monit /usr/bin/monit.5.3.2
wget https://mmonit.com/monit/dist/binary/5.24.0/monit-5.24.0-linux-x64.tar.gz
tar xvfz monit-5.24.0-linux-x64.tar.gz -C ./
sudo cp monit-5.24.0/bin/monit /usr/bin/
# ~/.monitrc, /etc/monitrc, /usr/local/etc/monitrc, /usr/local/etc/monitrc or at ./monitrc しか読んでくれないためsymlink
sudo ln -s /etc/monit/monitrc /etc/monitrc
sudo monit start
sudo monit status
トラブル †
check programで監視中に復帰しない事がある †
以下、monit 5.25.1 に更新すると解消する事を確認。
- pathで指定するヘルスチェックスクリプトは、exit code: 0:成功 , !0: 失敗 とする必要がある。
- 5.14.0とは挙動が変わり、pathで指定されたスクリプト失敗時に1回だけexecが実行される。
- ヘルスチェック成功後に、失敗すると再度execが実行される。
- ヘルスチェックが失敗し続ける場合、再度実行はされない。
- 障害テストのためtcp/80をブロック
sudo iptables -A INPUT -p tcp -m tcp --dport 14186 -j DROP
- /opt/healthcheck/httpd/check.sh のexit statusが!0を返す
- 3回ヘルスチェックが失敗したら、execが実行される。(想定通り)
- 障害から復帰したつもりでiptablesを停止
sudo service iptables stop
- 手動では /opt/healthcheck/httpd/check.sh のexit statusが0を返す
- /var/log/monit.log には /opt/healthcheck/httpd/check.sh のexit status が !0 のまま(異常)で、再起動を繰り返す。(想定外)
監視中のファイルを変更すると実行に失敗する †
- monit v5.14.0
- check programで監視対象スクリプトをvim等で書き換えても、古いファイルが実行される。恐らくi-nodeが変わっても追従してくれない。reloadすると新しいファイルを見てくれるようになる。
sudo monit reload
ゾンビプロセスが増加する †
- 既知の不具合のようだ
- Monit Manual
This means that every "check program" will be associated with either a running process or a temporary zombie. This unwanted zombie side-effect will be removed in a later release of Monit.
# ゾンビプロセスの表示
ps aux | awk '{if($8 ~ /Z/) print}'
CPU Usage監視がうまく動作しない †
- 現象
- Ubuntu 12.04 LTS / monit 5.3.2でCPU監視を使い、プロセスのCPU 100%が数回続いたときにプロセスの再起動をさせたい。
- 4コアCPUで、topでプロセスを見るとCPU 100%だが、monit statusでは25%(1/4 CPUコア)と表示される。topは2コア使えば200%表記になる。
- memory usageは正常に見える。
動作確認 †
設定ファイルの構文チェック †
monit -t
アラートメール送信 †
デバッグ †
- -vで設定の詳細を表示
sudo monit -v
exec †
- M/Monit | Wiki execのデバッグ
- exec "/path/cmd" のようにフルパスで指定する。
- exec "/bin/bash -c 'cmd'" の場合は、いくつかのPATHが設定済み
- エスケープ文字(",')は削除されるようだ。コマンド複数パイプ等で並べたい場合は、別shell scriptにした方が良い。
- エラーがあってもログには出ない。
監視状況の確認 †
CentOS 6.x用rpm †
- 自分でビルドする場合
mkdir -p ~/rpm/{BUILD,SRPMS,SPECS,SOURCES,RPMS}
cd rpm
echo "%_topdir $HOME/rpm" > ~/.rpmmacros
# 依存パッケージをインストール
sudo yum install flex pam-devel -y
wget https://mmonit.com/monit/dist/monit-5.14.tar.gz
tar xvfz monit-5.14.tar.gz
cp monit-5.14/system/packages/redhat/monit.spec SPECS/
mv monit-5.14.tar.gz SOURCES/
# ビルド
rpmbuild -bb SPECS/monit.spec
# インストール
sudo rpm -Uvh ./RPMS/x86_64/monit-5.14-1.x86_64.rpm
- デフォルトインストールファイル。デフォルトだとあまりRedHatらしくない。
rpm -ql monit
/etc/init.d/monit
/etc/monitrc
/usr/bin/monit
/usr/share/doc/monit-5.14
/usr/share/doc/monit-5.14/COPYING
/usr/share/doc/monit-5.14/README
/usr/share/man/man1/monit.1.gz
- 不足しているもの
- /var/log/monit.log
- /etc/logrotate.d/monit
- /etc/monit.d