プロセス監視(シェルスクリプト)
20160323

概要
 任意のプロセス及びパーティションを監視し、異常があればメールを送信、
 同時にプロセスの再起動を試みる処理をシェルスクリプトで自動化させます。

 2012/02/04 パーティション監視機能を追加し、サービス追加時に正常に動作しない問題を修正
確認環境
 CentOS7.x
※CentOS7未満の場合は、プロセス監視(シェルスクリプト)をご参照ください。。
◆監視プロセス(デフォルトの場合)
 "httpd"
 "postfix"
 "dovecot"
 "vsftpd"
 "named"
 "chronyd"
 "openvpn"
 "dhcpd"
 "samba(smbd/nmbd)"

◆監視パーティション
 "/boot"

追加変更も可能
◆プロセスの再起動について
 現在、「systemctl restart プロセス名」で実行出来る物のみ対応しています。
◆処理の流れ
 1.「ps -ef | grep プロセス名」にて対象プロセスが実行されているか確認。
 →パーティション監視については「df」にて使用率を計測
 2.動作を確認出来なければ異常と判断し、メール通知とプロセスの再起動を試みる。
  →再起動は「systemctl restart プロセス名」コマンドを使用
  →以降、回復を検知するまでプロセスの再起動は試みるが、メール通知はしない。
 3.プロセスの回復を検知した場合はメールで通知。

tmpファイルを作成する事から、「tmpfs(RAMディスク)」の設定も検討して下さい。
◆まずはシェルスクリプトの作成
 [root@Server ~]# vi /root/process_check.sh

#!/bin/sh
export LANG=ja_JP.UTF-8

# Ver 20150112

# 監視プロセス
# 追加する場合は半角スペースを空けて追記して下さい。
LIST="httpd postfix dovecot vsftpd named ntpd openvpn dhcpd nmbd smbd"

# /bootパーティション監視(デフォルト有効)
BOOT_CHECK="yes"
# 使用率警告の閾値指定(デフォルト70%以上使用)
BOOT_RITU="70"

# ログ保存先
LOG="/var/log/process_check.log"

# 状態管理ファイル保存先
TMP="/tmp/process_check.tmp"

# 異常を検知した際にメールを送信するか否か。「no」で無効。(デフォルト有効)
MAILMESSAGES="yes"
# メール送信先アドレス。(デフォルトroot宛)
MAILADDRESS="root"

# 異常を検知した際にプロセスの再起動を実行するか否か。「no」で無効。(デフォルト有効)
# 「systemctl restart プロセス名」で実行出来る物のみ対応
RESTART="yes"

# タイムスタンプ設定
LOG_DATE=`date '+%Y/%m/%d %k:%M:%S'`

if [ $BOOT_CHECK = "yes" ] ; then
if grep boot $TMP > /dev/null 2>&1 ; then
:
else
echo boot=0 >> $TMP
fi
BOOT_DIR_SIZE=`df | grep /dev/sda1 | egrep -o [0-9][0-9]% | egrep -o [0-9][0-9]`
PROCESS_CHECK=`grep boot $TMP | grep -o [0-1]`
if [ $BOOT_DIR_SIZE -ge $BOOT_RITU ] ; then
if [ $PROCESS_CHECK -eq 0 ] ; then
sed -i "s/boot=0/boot=1/g" $TMP
echo "["$LOG_DATE"] ""「/boot」パーティション使用率警告「$BOOT_DIR_SIZE%」" >> $LOG
if [ $MAILMESSAGES = "yes" ] ; then
echo -e "「/boot」パーティション使用率が閾値を上回りました。\n現在の使用率「$BOOT_DIR_SIZE%」"| mail -s "$0" $MAILADDRESS
fi
fi
elif [ $PROCESS_CHECK -eq 1 ] ; then
sed -i "s/boot=1/boot=0/g" $TMP
echo "["$LOG_DATE"] ""「/boot」パーティション使用率正常「$BOOT_DIR_SIZE%」" >> $LOG
if [ $MAILMESSAGES = "yes" ] ; then
echo -e "「/boot」パーティションの使用率が閾値を下回りました。\n現在の使用率「$BOOT_DIR_SIZE%」"| mail -s "$0" $MAILADDRESS
fi
fi
fi
for PROCESS in $LIST
do
if grep $PROCESS $TMP > /dev/null 2>&1 ; then
:
else
echo $PROCESS=0 >> $TMP
fi
done

for PROCESS in $LIST
do
COUNT=`ps -ef | grep $PROCESS | grep -v grep | wc -l`
PROCESS_CHECK=`grep $PROCESS $TMP | grep -o [0-1]`
if [ $COUNT -eq 0 ] ; then
if [ $PROCESS_CHECK -eq 0 ] ; then
sed -i "s/$PROCESS=0/$PROCESS=1/g" $TMP
echo "["$LOG_DATE"] ""「$PROCESS」の動作異常を検知しました。" >> $LOG
if [ $MAILMESSAGES = "yes" ] ; then
if [ $RESTART = "yes" ] ; then
echo -e "プロセス監視にて、「$PROCESS」の動作異常を検知しました。\nプロセスの再起動を試みます。"| mail -s "$0" $MAILADDRESS
`systemctl restart $PROCESS`
else
echo -e "プロセス監視にて、「$PROCESS」の動作異常を検知しました。"| mail -s "$0" $MAILADDRESS
fi
fi
fi
elif [ $PROCESS_CHECK -eq 1 ] ; then
sed -i "s/$PROCESS=1/$PROCESS=0/g" $TMP
echo "["$LOG_DATE"] ""「$PROCESS」の動作回復を検知しました。" >> $LOG
if [ $MAILMESSAGES = "yes" ] ; then
echo -e "プロセス監視にて、「$PROCESS」の動作回復を検知しました。"| mail -s "$0" $MAILADDRESS
fi
fi
done
◆一応実行権限を付与
 [root@Server ~]# chmod +x /root/process_check.sh
◆cronにて自動実行するよう設定しましょう。
 [root@Server ~]# echo "*/5 * * * * root bash /root/process_check.sh >/dev/null 2>&1" >> /etc/crontab

この場合、5分毎に監視します。
変更する場合はcrontabにて設定を確認して下さい。