pgrepを使ってプロセス監視

以前はプログラムの起動時にPIDを入れた一時ファイルを作成する方法をとっていましたが、その方法が通用するのは正常起動・終了が前提で起動監視としては機能不足です。
時々チャットサーバーが落ちていることがあるため(まったく原因が不明)起動監視&アラート送信を行います。その時にプロセス監視を行うためにpgrepを使用しますが、下記の項目に気をつけないとイタイ目にあいます。

Q1. デフォルトではプロセス名が部分一致なので予期しないプロセスがマッチする。
A1. xオプションをつけて完全一致にさせる

Q2. 同じプロセスが存在する。
A2. uまたはUオプションでユーザーを指定するかfオプションでディレクトリも確認する。それでも複数ヒットする場合は…。(a.outとか安易にマッチしそうな名前にしないこと?)

Q3. プロセス名が長いとマッチしない
A3. OSによるがfオプション無しの場合一定文字列長でプロセス名が切り捨てられる。fオプションをつけるか、lオプションでマッチしたプロセス名を確認する。

以上の注意よりコマンドでは下記のように検査する。

# pgrep -f -x -U username ./socket_server
10042

プロセスが生きていればこのようにPIDが出てきて(複数だと複数行に)生きてなければ空を返します。
これを利用してcrontabで監視する場合はこちら

#!/bin/sh
TARGET=socket_server
cd $TARGETDIR
ret=`pgrep -f -x -U $USER ./$TARGET`
if [ -z $ret ]; then
echo ‘SERVER IS DEAD’ | mail -s ‘NOTIFY’ info@test.net
./serverctrl.sh start
fi

crontabを利用せず、バックグランドで見張る場合はsleepで永久ループ。ただしこれ自身が落ちたら意味ない。

#!/bin/sh
INTERVAL=15
TARGET=socket_server
cd $TARGETDIR
while true; do
ret=`pgrep -f -x -U $USER ./$TARGET`
if [ -z $ret ]; then
echo ‘SERVER IS DEAD’ | mail -s ‘NOTIFY’ info@test.net
./serverctrl.sh start
fi
sleep $INTERVAL
done

プロセスは生きているけどフリーズしているとかはまた別の方法で検査します。