2

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

Tomcat 应用程序最多可能需要 10 分钟才能启动,这对于查看发生的情况非常有用。

尽管如此,如果启动确认消息未能出现在日志中,我们仍需要确保此启动脚本不会无限期地运行。

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

要求:

  1. 无需您在最新的 Debian、Ubuntu、RedHat 和 OS X 上安装任何东西即可运行
  2. 结束时没有留下任何进程(由于任何原因)
  3. 将记录的行显示到标准输出
  4. 日志文件是只读的,你不能触摸它
  5. 日志文件可以在不破坏工具的情况下旋转
  6. 额外的荣誉,如果你可以让它在一行中工作

目前发现的问题:

  • read -t在当前的 Debian 上不可用,Illegal option -t

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

4

1 回答 1

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

其余的我相信你应该有:kill, sed, sleep, grep, echo, xargs.

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

  1. 只需按要求输出日志内容。
  2. 监视输出以查找特定字符串“ STARTED ”;如果找到,kill第 1 部分和第 3 部分。
  3. 等待 15 分钟,如果 15 分钟过去,则kill第 1 部分和第 2 部分以代码 3 退出以向外部评估发出信号,表明整个命令由于超时而结束。

附评论:

( 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 ”字符串,则该命令实际上只会在带有“ STARTED ”的行之后向server.log添加额外的行后退出并打印消息“ server up ”。那是因为当打印“ STARTED ”行时,会找到它,打印它的输出并退出,关闭它的输入。但是,相应的会继续运行,直到它有别的东西要写;只有这样才会意识到它的输出是关闭的,然后会死掉,继续执行将导致评估的命令。AFAIK,没有解决方法。greptailtailkillSTARTED ”消息,如果还没有的话。

于 2013-05-08T01:40:01.790 回答