アプリケーションサーバーやデータベースのようなミドルウェアを起動するシェルスクリプトです。
設定ファイルにミドルウェアを起動させるための実行コマンドや確認プロセスを記述することにより、汎用性を高めています。
プロセスだけではなく、ミドルウェア独自の確認項目がある場合は、別個にシェルスクリプトを作成することをお勧めします。
このシェルスクリプトの仕様は、以下のようになります。
仕様
- 起動対象のカテゴリーを引数に指定する
- リストファイルから起動対象のカテゴリーを読み込み、情報をメモリーに格納する
- 起動対象のプロセスが存在した場合は、ワーニングとして終了する
- プロセスを起動後、一定間隔でプロセスの確認をする
- 対象のプロセスがひとつでも存在しない場合は、エラーとする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
#!/bin/bash ### 定数 readonly CATEGORY=$1 # カテゴリー readonly LIST=/shell/start.lst # リストファイル readonly LOOP_MAX=3 # 最大ループ数 readonly SLEEP_TIME=5 # 待機時間(秒) ### 関数 proc_chk() { local num=0 num=$(ps -ef | grep $1 | grep -v grep | wc -l) return "$num" } ### リストファイル存在確認 if [[ ! -r "$LIST" ]] then echo "リストファイル[$LIST]が存在しません" exit 1 fi ### 引数確認 if [[ -z "$CATEGORY" ]] then echo "引数がありません" exit 1 fi ### リスト内容を取得 arr_cnt=0 while read line do col1=$(echo "$line" | cut -d, -f1 2> /dev/null) col2=$(echo "$line" | cut -d, -f2 2> /dev/null) col3=$(echo "$line" | cut -d, -f3 2> /dev/null) col4=$(echo "$line" | cut -d, -f4 2> /dev/null) ### 対象カテゴリー以外は読み飛ばす if [[ "$CATEGORY" != "$col1" ]] then continue fi ### メモリーに設定情報を格納 case "$col2" in E) # 実行コマンド exe_com="$col3" ;; P) # 確認プロセス proc_nam[$arr_cnt]="$col3" proc_val[$arr_cnt]="$col4" (( arr_cnt++ )) ;; esac done < "$LIST" ### カテゴリーなし if [[ -z "$exe_com" ]] then echo "対象カテゴリーがありません" exit 1 fi ### プロセス確認 proc_flg=0 for name in "${proc_nam[@]}" do proc_chk "$name" if (( $? > 0 )) then echo "プロセス[$name]が存在しています" proc_flg=1 fi done ### プロセスが存在している場合、処理終了 if [[ "$proc_flg" == 1 ]] then exit 2 fi ### プロセス起動 $exe_com if (( $? != 0 )) then echo "プロセス[$exe_com]の起動が失敗しました" exit 1 fi ### 起動後プロセス確認 arr_cnt=0 exe_flg=0 for name in "${proc_nam[@]}" do loop_cnt=0 while (( loop_cnt < LOOP_MAX )) do proc_chk "$name" if (( $? != ${proc_val[arr_cnt]} )) then sleep "$SLEEP_TIME" (( loop_cnt++ )) else break fi done if (( loop_cnt >= LOOP_MAX )) then exe_flg=1 fi (( arr_cnt++ )) done ### 成否判定 if [[ "$exe_flg" == 0 ]] then echo "プロセス[$exe_com]の起動が成功しました" exit 0 else echo "プロセス[$exe_com]の起動が失敗しました" exit 1 fi |
メモ
プロセスの確認は、プロセスの起動前と起動後で同じ処理を行うので、関数にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
### プロセス起動リスト # E:[実行コマンド] カテゴリー,モード,実行コマンド # P:[確認プロセス] カテゴリー,モード,確認プロセス,プロセス数 ### [TEST1] TEST1,E,/shell/start_test1 & TEST1,P,/shell/test1_proc1,1 TEST1,P,/shell/test1_proc2,1 TEST1,P,/shell/test1_proc3,3 ### [TEST2] TEST2,E,/shell/start_test2 & TEST2,P,/shell/test2_proc1,1 |
メモ
TEST1というカテゴリーは、start_test1というプログラムを&(アンパーサンド)をつけて実行し、プロセスtest1_proc1とtest1_proc2が1つ、プロセスtest1_proc3が3つあることを確認するという意味です。