2

我正在尝试获取一个 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

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

4

2 回答 2

4

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

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

结束 tail -f 在 shell 脚本中开始

这是我想出的:

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