アプリケーションサーバーが確実に動作するようにするには、次のことが必要です
- 特定の文字列のログ ファイルを追跡する
- その文字列が出力されるまでブロックされたまま
- ただし、文字列が約 20 分間出力されない場合は、終了してスローし、「サーバーの起動に 20 分以上かかりました」などの例外メッセージが表示されます。
- 文字列がログ ファイルに出力された場合は、ループを終了して続行します。
while ループにタイムアウトを含める方法はありますか?
#!/bin/bash
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var
[ $? -eq 0 ] && echo 'ok' || echo 'server not up'
これは、ログファイルに書き込まれたものをすべて読み取り、特定の単語を検索し、問題がなければOKをエコーし 、そうでなければ1200秒(20分)待った後に文句を言います。
シェル・スクリプトからシグナル・ハンドラーを使用できます ( http://www.ibm.com/developerworks/aix/library/au-usingtraps/index.htmlを参照)。
基本的には、たとえばシグナル 17 で呼び出される関数を定義し、後でそのシグナルを送信する添え字をバックグラウンドに配置します。
timeout(pid) {
sleep 1200
kill -SIGUSR1 $pid
}
watch_for_input() {
tail -f file | grep item
}
trap 'echo "Not found"; exit' SIGUSR1
timeout($$) &
watch_for_input
次に、1200 秒に達すると、関数が呼び出され、何をするかを選択できます (パターンを強制終了するために、パターンを監視している tail/grep コンボにシグナルを送るなど)。
次のように実行できます。
start_time=$(date +"%s")
while true
do
elapsed_time=$(($(date +"%s") - $start_time))
if [[ "$elapsed_time" -gt 1200 ]]; then
break
fi
sleep 1
if [[ $(grep -c "specific string" /path/to/log/file.log) -ge 1 ]]; then
break
fi
done
time=0
found=0
while [ $time -lt 1200 ]; do
out=$(tail logfile)
if [[ $out =~ specificString ]]; then
found=1
break;
fi
let time++
sleep 1
done
echo $found