Unix to tail解决方案,用于等待特定字符串或在超时后退出

时间:2013-04-12 12:12:38

标签: sed grep tail

我正在尝试改进服务(守护程序)脚本以显示tomcat输出(从tty运行时),直到应用程序有效启动。

Tomcat应用程序最多可能需要10分钟才能启动,看看会发生什么情况非常有用。

但是,如果启动确认消息未能显示在日志中,我们需要确保此启动脚本无法无限期运行。

我知道互联网上充满了类似的问题,但到目前为止,我无法确定一个明确的解决方案,尤其是那个无需默认情况下无法使用的实用工具的解决方案。

要求:

  1. 运行时无需在最近的Debian,Ubuntu,RedHat和OS X上安装任何东西
  2. 结束时(由于任何原因)没有留下任何进程
  3. 将记录的行显示为stdout
  4. 日志文件是readonly,你不能触摸它
  5. 日志文件可以在不破坏工具的情况下旋转
  6. 如果你可以让它在一行中工作,那就是额外的荣誉
  7. 到目前为止已发现的问题:

      目前的Debian read -t 上没有
    • Illegal option -t

    到目前为止对部分解决方案的引用:

1 个答案:

答案 0 :(得分:2)

如果您希望脚本监视等待特定字符串的tomcat输出,则下面的解决方案应该有效,并且它不使用read -t

( tail -f server.log & ( (tail -f server.log | grep -l STARTED && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | xargs` ) & sleep 900 && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | xargs` && exit 3 ) ) ; [ $? -eq 3 ]  && echo 'server not up after 5 min'  || echo 'server up'

它正在日志文件 server.log 中搜索字符串“ STARTED ”,超时为15分钟(900秒)。 我不确定你的Debian中有什么。您应该有pstree,其输出应类似于:

$ pstree -pa 1803
bash,1803
  └─bash,7850
      ├─bash,7852
      │   ├─bash,7853
      │   │   ├─grep,7856 --color=auto -l STARTED
      │   │   └─tail,7855 -f server.log
      │   └─sleep,7854 20
      └─tail,7851 -f server.log

其他我确定你应该拥有:killsedsleepgrepechoxargs。< / p>

对正在发生的事情的一些解释。此行包含一个命令和命令结果的最终评估,以便在服务器启动时进行打印。该命令分为3部分:

  1. 根据要求输出日志内容。
  2. 监视输出,查找特定字符串“ STARTED ”;如果找到,kill第1和第3部分。
  3. 等待15分钟,如果15分钟过去,kill第1和第2部分, 退出代码3,向外界评估信号 整个命令因超时而结束。
  4. 评论:

    ( tail -f server.log & # part 1 - just output the log content
      ( # part 2
        (tail -f server.log | grep -l STARTED # search for the string
         && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | 
            sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | 
            xargs` # if found, kill the remaining tails and sleeps
        ) & # if the command ends in part 2, exit code is not 3
      sleep 900 # part 3: sleep 15 minutes
      && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | 
                  sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | 
                  xargs` # if time passed, kill the remaining tails and sleeps
      && exit 3 # exit with code 3, so that the outside evaluation 
                # knows it ended by timeout
      )
    ) ; # end of command; whenever it finishes, the evaluation below is executed, 
        # checking the exit code to print the appropriate message
    [ $? -eq 3 ]  && echo 'server not up after 5 min'  || echo 'server up'
    

    请注意,由于bash管道的工作原理,如果找到“ STARTED ”字符串,该命令实际上只会退出并打印消息“ server up “在” STARTED “行之后,在 server.log 之后添加了一行。这是因为当打印“ STARTED ”行时,grep将找到它,打印输出并退出,关闭其输入。但是,相应的tail将继续运行,直到它还有其他东西要写;只有这时tail才会意识到它的输出已关闭,然后将会死亡,继续执行将导致评估的kill命令。 AFAIK没有解决方法。您应该确保在“ STARTED ”消息之后将某些内容打印到日志中,如果它还没有。