2

アプリインスタンスが起動したことを認識するシェルスクリプトを取得しようとしています。そうすれば、コマンドの発行を続行できます。

私はそれがこのようなものになるだろうと思っていました:

#/bin/bash

startApp.sh

while [ `tail -f server.log` -ne 'regex line indicating success' ]
do

sleep 5

done

echo "App up"

しかし、これがうまくいったとしても、いくつかの懸念に対処することはできません。

  • アプリが起動しない場合、どのくらい待機しますか
  • アプリの起動時にエラーが発生した場合はどうなりますか
  • ログラインをキャプチャしてエコーするにはどうすればよいですか

私は近くにいますか、それとももっと良い方法がありますか?これは他の管理者が克服しなければならなかったことだと思います。

編集:

私はこれをスーパーユーザーで見つけました

https://superuser.com/questions/270529/monitoring-a-file-until-a-string-is-found

tail -f logfile.log | while read LOGLINE
do
   [[ "${LOGLINE}" == *"Server Started"* ]] && pkill -P $$ tail
done

これに関する私の唯一の問題は、それが決して終了しないかもしれないということです。最大時間を追加する方法はありますか?

4

2 に答える 2

4

わかりました、最初の答えは近いですが、私が起こり得ると思ったすべてを説明していませんでした。

私はこのリンクからコードを適応させました:

終了tail-fはシェルスクリプトで開始されました

これが私が思いついたものです:

#!/bin/bash

instanceDir="/usr/username/server.name"
serverLogFile="$instanceDir/server/app/log/server.log"

function stopServer() {

    touch ${serverLogFile}

    # 3 minute timeout.
    sleep 180 &
    local timerPid=$!

    tail -n0 -F --pid=${timerPid} ${serverLogFile} | while read line 
    do
        if echo ${line} | grep -q  "Shutdown complete"; then
          echo 'Server Stopped'
          # stop the timer..
          kill ${timerPid} > /dev/null 2>&1
        fi
    done &

    echo "Stoping Server."
    $instanceDir/bin/stopserver.sh > /dev/null 2>&1

    # wait for the timer to expire (or be killed)
    wait %sleep


}

function startServer() {

    touch ${serverLogFile}

    # 3 minute timeout.
    sleep 180 &
    local timerPid=$!

    tail -n0 -F --pid=${timerPid} ${serverLogFile} | while read line 
    do
        if echo ${line} | grep -q  "server start complete"; then
          echo 'Server Started'
          # stop the timer..
          kill ${timerPid} > /dev/null 2>&1
        fi
    done &

    echo "Starting Server."
    $instanceDir/bin/startserver.sh > /dev/null 2>&1 &

    # wait for the timer to expire (or be killed)
    wait %sleep

}

stopServer
startServer
于 2012-09-14T19:53:17.220 に答える
2

まあ、tail -f決して終了しないので、それはあなたが望むものではありません。

numLines=10
timeToSleep=5
until tail -n $numLines server.log | grep -q "$serverStartedPattern"; do 
  sleep $timeToSleep
done

これは、サーバーが起動$numLinesしたときに表示される可能性のある行数よりも大きいことを確認してください。$timeToSleep

これは永遠に続きます。非常に多くの時間を許可したい場合は、次のようにループの反復回数に上限を設けることができます。

let maxLoops=60 numLines=10 timeToSleep=5 success=0
for (( try=0; try < maxLoops; ++try )); do 
  if tail -n $numLines server.log | grep -q "$serverStartedPattern"; then
    echo "Server started!"
    success=1
    break
  fi
  sleep $timeToSleep
done

if (( success )); then
  echo "Server started!"
else 
  echo "Server never started!"
fi

exit $(( 1-success ))
于 2012-09-13T19:57:17.447 に答える