2022年5月7日土曜日

プロセス監視スクリプト (Linux版)

サーバーのプロセス監視は、監視ソフトウェア(ZabbixやJP1など)を使えば当たり前のように実現できる。ただし、環境やライセンスの関係でエージェントの導入ができない場合がある。

そのような場合でも、スクリプトを使ってプロセス監視を行うことは可能となる。ログに出力さえできれば、Linuxの場合はrsyslogなどでログを別のサーバに転送でき、そのサーバで監視させるといったことも可能である。

今回は、Linuxのプロセス監視を行うスクリプトを作ってみたので、その内容を記載する。

実現方法

本スクリプトの設計概要を図示する。

このスクリプトは、設定ファイル(check-process.conf)に監視対象のプロセス及び起動プロセス数を記載しておき、psコマンドにて監視対象の起動プロセス数を確認する。

プロセスダウンを検知した際は、loggerコマンドで/var/log/messagesにエラーメッセージを出力する。エラーメッセージ出力タイミングは、プロセスダウンの初回発生時のみとし、それ以外は情報メッセージとして出力する。

以下に、本スクリプトで発生するメッセージを記載する。

プロセス状態 メッセージ
正常時 [INFO] Process XXX up
正常状態継続時 [INFO] Process XXX still up
ダウン時 [ERROR] Process XXX down
ダウン状態継続時 [INFO] Process XXX still down

この処理をcronで1分間隔で実行するよう登録し、定期的なプロセス監視を実現する。

スクリプト実行手順

1. スクリプト配置

以下にスクリプトのコードを記載する。GitHubにも配置してある。

スクリプト本体:check-process.sh

#!/bin/bash
################
# Scripts name : check-process.sh
# Usage        : ./check-process.sh
#                同一ディレクトリにcheck-process.confを配置し、cronで定期実行する。
# Description  : Linuxプロセスチェックスクリプト
# Create       : 2017/12/14 tech-mmmm (https://tech-mmmm.blogspot.com/)
# Modify       : 2022/05/01 tech-mmmm (https://tech-mmmm.blogspot.com/)
################

currentdir="$(dirname "$0")"
conffile="${currentdir}/check-process.conf"    # 設定ファイル
tmpfile="${currentdir}/check-process.tmp"      # プロセス情報保存用一時ファイル

# すでにDownしているプロセス情報を取得
if [ -f "${tmpfile}" ]; then
    down_process=$(paste -d "|" -s "${tmpfile}")
fi
echo -n > "${tmpfile}"

# 設定ファイル読み込み
while read line || [ -n "${line}" ]; do
    # 空白区切りで分割
    process_name=$(echo "${line}" | awk '{print $1}')
    process_num=$(echo "${line}" | awk '{print $2}')
    
    # コメント行と空行を処理しない
    if [ "$(echo "${process_name}" | grep -c -v -e '^ *#' -e '^$')" -gt 0 ]; then      
        # 現在のプロセス数を取得
        count=$(ps ahxo args | grep "${process_name}" | grep -c -v -e "^grep")
        
        # プロセス数チェック
        if [ "${count}" -lt "${process_num}" ]; then
            # Down時の処理
            # すでにDownしているプロセスか確認
            if [ -n "${down_process}" ] && [ "$(echo ${process_name} | grep -c -E ${down_process})" -gt 0 ]; then
                # すでにDown
                message="[INFO] Process \"${process_name}\" still down"
            else
                # 初回Down
                message="[ERROR] Process \"${process_name}\" down"
            fi
            # ログへ出力
            echo "${message}"
            logger "${message}"
            
            # Donwしているプロセス情報を出力
            echo "${process_name}" >> "${tmpfile}"
        else
            # Up時の処理
            # Downしていたプロセスか確認
            if [ -n "${down_process}" ] && [ "$(echo ${process_name} | grep -c -E ${down_process})" -gt 0 ]; then
                # Downだった
                message="[INFO] Process \"${process_name}\" up"
            else
                # すでにUp
                message="[INFO] Process \"${process_name}\" still up"
            fi
            # ログへ出力
            echo "${message}"
            logger "${message}"
        fi
    fi
done < "${conffile}"

exit 0

設定ファイル例:check-process.conf

# Process mame Number of process
/usr/sbin/chronyd 1
/usr/sbin/httpd 5

2. cronへの登録

スクリプトを/root/scriptディレクトリに配置した場合を例として、1分間隔で監視させるようcronを以下のように設定する。

# crontab -e
*/1 * * * * /root/script/check-process.sh

3. 監視テスト

実際にプロセスを停止させて動作確認をしてみよう。httpdを停止させてプロセス停止を検知することを確認してみる。

# systemctl stop httpd
# tail -10 /var/log/messages | grep -E "INFO|ERROR"
May  1 15:12:07 t1192rhel root[76941]: [INFO] Process "/usr/sbin/chronyd" still up
May  1 15:12:07 t1192rhel root[76955]: [ERROR] Process "/usr/sbin/httpd" down ★停止を検知

次に、復旧時の動作を確認する。

# systemctl start httpd
# tail -10 /var/log/messages | grep -E "INFO|ERROR"
May  1 15:12:07 t1192rhel root[76941]: [INFO] Process "/usr/sbin/chronyd" still up
May  1 15:12:07 t1192rhel root[76955]: [ERROR] Process "/usr/sbin/httpd" down
May  1 15:13:46 t1192rhel root[77291]: [INFO] Process "/usr/sbin/chronyd" still up
May  1 15:13:46 t1192rhel root[77308]: [INFO] Process "/usr/sbin/httpd" up ★復旧

以上。

更新履歴

  • 2017/12/16 新規作成
  • 2022/05/07 全体的にスクリプトの構成を見直し

0 件のコメント:

コメントを投稿

人気の投稿