サーバーのプロセス監視は、監視ソフトウェア(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 件のコメント:
コメントを投稿