如果您想要一个脚本来监视等待特定字符串的 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 个部分:
- 只需按要求输出日志内容。
- 监视输出以查找特定字符串“ STARTED ”;如果找到,
kill
第 1 部分和第 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,没有解决方法。grep
tail
tail
kill
STARTED ”消息,如果还没有的话。