サービスのプロセス監視を ps から systemctl に変更した
サービスのプロセス監視について
以前は、RHEL系のサービス監視は下記のように、psコマンド + grepコマンド を使っていました。
この監視では以下の問題点があります
- 誤検知の可能性がある
- サービス管理状態は確認できない
- systemd 管理サービスには適していない
cnt=ps -ef | grep httpd | grep -v grep | wc -l if [ $cnt2 = 0 ]; then systemctl restart httpd systemctl restart php-fpm fi
CentOS7 以降(Rocky / Alma / RHEL 含む)は systemd 管理なので、サービス状態の確認は systemctl を使ったほうが良いのとスクリプトもスッキリします
今回はサービス監視スクリプトを systemctl ベースへ修正しました。
systemctl を利用した監視
systemd 環境では以下のようにサービス監視ができます。「active」が返ってくるとサービスは稼働しています
$ systemctl is-active httpd active
標準出力を非表示にするとシェルスクリプトでは画面出力を抑えることができます
systemctl is-active --quiet httpd
主な特徴と動作
is-active: サービスが active(稼働中)か inactive(停止中)かを確認します。--quiet: 標準出力(active/inactive というテキスト)を非表示にします。- 終了コード(exit code): サービスが稼働中の場合は
0、それ以外の場合は 0 以外の値を返します
実際の監視スクリプト(引数でサービス指定)
サービス名を引数で受け取る形にしました。
#!/bin/bash
MAILBODY=/root/tmp/proc_check.log
HOST=`hostname`
if [ $# -ge 1 ]; then
SERVICE=$1
else
echo "Usage: $0 ServiceName"
exit 1
fi
if ! systemctl is-active --quiet ${SERVICE}; then
echo "${SERVICE} is dead."
sleep 15
if ! systemctl is-active --quiet ${SERVICE}; then
if [ "${SERVICE}" = "openvpn" ]; then
systemctl restart openvpn-server@server
elif [ "${SERVICE}" = "httpd" ]; then
systemctl restart httpd
systemctl restart php-fpm
else
systemctl restart ${SERVICE}
fi
MailSubject="${SERVICE}_is_dead_${HOST}"
date > ${MAILBODY}
echo "${SERVICE} is dead. ${SERVICE} start" >> ${MAILBODY}
systemctl status ${SERVICE} >> ${MAILBODY}
cat ${MAILBODY} | /bin/mail -s "${MailSubject}" your@email.address
fi
fi

