サービスのプロセス監視を 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

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です