我正在尝试改进服务(守护程序)脚本以显示tomcat输出(从tty运行时),直到应用程序有效启动。
Tomcat应用程序最多可能需要10分钟才能启动,看看会发生什么情况非常有用。
但是,如果启动确认消息未能显示在日志中,我们需要确保此启动脚本无法无限期运行。
我知道互联网上充满了类似的问题,但到目前为止,我无法确定一个明确的解决方案,尤其是那个无需默认情况下无法使用的实用工具的解决方案。
要求:
到目前为止已发现的问题:
read -t
上没有Illegal option -t
到目前为止对部分解决方案的引用:
答案 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
其他我确定你应该拥有:kill
,sed
,sleep
,grep
,echo
,xargs
。< / p>
对正在发生的事情的一些解释。此行包含一个命令和命令结果的最终评估,以便在服务器启动时进行打印。该命令分为3部分:
kill
第1和第3部分。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 ”字符串,该命令实际上只会退出并打印消息“ server up “在” STARTED “行之后,在 server.log 之后添加了一行。这是因为当打印“ STARTED ”行时,grep
将找到它,打印输出并退出,关闭其输入。但是,相应的tail
将继续运行,直到它还有其他东西要写;只有这时tail
才会意识到它的输出已关闭,然后将会死亡,继续执行将导致评估的kill
命令。 AFAIK没有解决方法。您应该确保在“ STARTED ”消息之后将某些内容打印到日志中,如果它还没有。