そこで,プロセス一覧に指定したアプリケーションが表示されているか確認し,プロセスレベルで動作している事をもって正常とみなす.
ちなみに,アプリケーションレベルでの動作確認方法としては,例えば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 件のコメント:
コメントを投稿