そこで,プロセス一覧に指定したアプリケーションが表示されているか確認し,プロセスレベルで動作している事をもって正常とみなす.
ちなみに,アプリケーションレベルでの動作確認方法としては,例えばWEBサーバであれば特定のWEBページをHTTPを用いて表示させる,等がある.
check_proc_alive.bash
#!/bin/bash
# usage: check_proc_alive.bash
# 監視対象を記述したファイル
PROGLIST=/usr/local/etc/check_progs.conf
# util_common.bash(ucb_ps) を読み込む
# 1. PATH が通っているところから読み込む
# 2. このスクリプトがディレクトリ指定付で実行されていれば、
# このスクリプトと同じ場所から読み込む
# 3. 1., 2. でダメならエラー
FILE_UTIL=util_common.bash
. "${FILE_UTIL}" 2> /dev/null \
|| . "${0%/*}/${FILE_UTIL}" 2> /dev/null
if [ $? -ne 0 ]; then
echo "Can't load ${FILE_UTIL}!" 1>&2
exit 1
fi
# 指定されたプログラムのプロセス ID を取得する
#
# 使い方
# pidof [-s]
#
# 引数:
# -s
# 一つでもプロセスが見つかったら、そこで処理を終える
# prog_name
# 探すプログラムの名前
#
# 出力
# プロセスID_1 プロセスID_2 ...
# (プロセスが見つからない場合は空行を 1 行出力する)
#
# 終了ステータス:
# 0: プロセスが見つかった
# 1: プロセスが存在しなかった
pidof () {
local cmd_target # 探すコマンド
local is_single # -s オプションが指定されたか
# 引数の処理
is_single=false
case "$1" in
-s)
is_single=true
shift
;;
esac
cmd_target="$1"
# 以下のコマンド(パイプライン)の戻値が、関数の戻値になる
ucb_ps ax | (
# ここからサブシェルなので、変数の設定は呼び出し元には
# 影響しません。よって local 定義もありません
# ただし、変数の初期化は必要です。
pids=""
# へッダ行は捨てます
read line
# 2 行目以降の処理
while read pid tty stat time cmd args; do
# 対象行が求めるものであるか
was_found="false"
if [ "${cmd}" = "${cmd_target}" ]; then
# そのまま一致
was_found="true"
elif [ "${cmd##*/}" = "${cmd_target}" ]; then
# ベース名が一致
was_found="true"
fi
if ${was_found} ; then
pids="${pids} ${pid}"
if ${is_single}; then
# -s が指定されていればここで終わり。
# 終了ステータス 0
break
fi
fi
done
# 結果の表示
echo ${pids}
# 終了ステータスの設定
[ "${pids}" != "" ]
)
}
# プロセス生存監視
# 引数なし
check_alive_procs () {
# PROGLIST 存在チェック
if [ ! -r "${PROGLIST}" ]; then
echo "Can't read ${PROGLIST}"
return 1
fi
# PROGLIST の行ごとのループ
cat "${PROGLIST}" | while read prog ; do
case "${prog}" in
"") continue ;;
"#"*) continue ;;
esac
pids=$(pidof ${prog})
if [ $? -ne 0 ]; then
pids="DOWN"
fi
echo "${prog}: ${pids}"
done
}
check_alive_procs
0 件のコメント:
コメントを投稿