<link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7885523125238064555&amp;zx=d6db5238-41e7-417c-9f32-5484789387d1' rel='stylesheet'/>

2017年12月16日土曜日

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

サーバーのプロセス監視は、監視ソフトウェア(ZabbixやJP1など)を使えば当たり前のように実現できるが、ふと、スクリプトでも簡単に実装できるのでは?ということを思ったので、スクリプトを作成してみた。

実現方法

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


このスクリプトは、psコマンドにて監視対象のプロセス数を取得し、設定ファイル(check-process.conf)に記載されたプロセス数との比較を行う。

プロセスダウンを検知した際は、/var/log/messagesにエラーメッセージを出力し、Zabbixのログ監視で検知させることにする。エラーメッセージ出力タイミングは、プロセスダウンの初回発生時のみとした。これにより、1分毎にエラー検知することを防止する。

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

 ・プロセス初回ダウン時 → [ERROR] Process XXX down
 ・プロセス継続ダウン時 → [INFO] Process XXX still down
 ・プロセス回復時    → [INFO] Process XXX up

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

スクリプト

以下にスクリプトのコードを記載する。

なお、本スクリプトはGitHubにも配置してみた(GitHub初心者なので、ただアップロードしただけ)。

https://github.com/TetsuOkamoto/check-process-linux

・スクリプトファイル名:check-process.sh
#!/bin/bash

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

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

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

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

# エラー処理
if [ $rc -gt 0 ]; then
    logger
"[ERROR] Process check script error (Max Return Code : ${rc})"
fi

exit $?

・設定ファイル名:check-process.conf
# Process mame             Number of process
/usr/sbin/ntpd             1
/usr/sbin/zabbix_agentd    6

cronへの登録

スクリプトを/root/scriptディレクトリに配置した場合を例とする。この場合、cronには以下の通り設定を追加する。

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

Zabbixを使った監視テスト結果

実際に本スクリプトを使って監視テストを実施してみた。Zabbixにて/var/log/messagesに「ERROR」の文字列あった場合に検知するトリガーを設定し、意図的にchronyd (時刻同期デーモン)を停止してみた。

問題なく設定できていれば、以下のようなプロセスダウンのメッセージ通知がされるようになる。

------------------------------
Trigger: messages
Trigger status: PROBLEM
Trigger severity: Average
Trigger URL:

Item values:

1. messages (t3023ce72:log[/var/log/messages,"@messages word",,,skip]): Dec 14 22:23:01 t3023ce72 root: [ERROR] Process "/usr/sbin/chronyd" down
2. *UNKNOWN* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*
3. *UNKNOWN* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*

Original event ID: 3579

------------------------------

0 件のコメント:

コメントを投稿

人気の投稿