循环shell脚本,直到成功的日志消息

时间:2012-09-13 19:49:30

标签: shell

我正在尝试使用shell脚本来识别应用程序实例何时出现。这样它就可以继续发出命令。

我一直在想它会是这样的:

#/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

我唯一的问题是它可能永远不会退出。有没有办法在最长时间内添加?

2 个答案:

答案 0 :(得分:4)

好的,第一个答案很接近,但没有说明我认为可能发生的一切。

我改编了这个链接的代码:

Ending tail -f started in a shell script

以下是我提出的建议:

#!/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

答案 1 :(得分: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 ))