15

アプリケーションサーバーが確実に動作するようにするには、次のことが必要です

  1. 特定の文字列のログ ファイルを追跡する
  2. その文字列が出力されるまでブロックされたまま
  3. ただし、文字列が約 20 分間出力されない場合は、終了してスローし、「サーバーの起動に 20 分以上かかりました」などの例外メッセージが表示されます。
  4. 文字列がログ ファイルに出力された場合は、ループを終了して続行します。

while ループにタイムアウトを含める方法はありますか?

4

5 に答える 5

12
#!/bin/bash
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var
[ $? -eq 0 ]  && echo 'ok'  || echo 'server not up'

これは、ログファイルに書き込まれたものをすべて読み取り、特定の単語を検索し、問題がなければOKをエコーし​​ 、そうでなければ1200秒(20分)待った後に文句を言います。

于 2012-12-21T02:48:39.773 に答える
1

シェル・スクリプトからシグナル・ハンドラーを使用できます ( 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 コンボにシグナルを送るなど)。

于 2012-12-21T02:44:58.693 に答える
1

次のように実行できます。

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
于 2012-12-21T02:46:06.490 に答える
0
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
于 2012-12-21T02:49:48.177 に答える