Pat*_*ick 1 automation tomcat bash grep tail
我正在尝试配置一个启动脚本,该脚本将启动 tomcat,监视 catalina.out 中的字符串“服务器启动”,然后运行另一个进程。我一直在尝试 tail -f 与 grep 和 awk 的各种组合,但还没有任何工作。我遇到的主要问题似乎是在 grep 或 awk 匹配字符串后强制尾部死亡。
我已简化为以下测试用例。
test.sh is listed below:
#!/bin/sh
rm -f child.out
./child.sh > child.out &
tail -f child.out | grep -q B
child.sh is listed below:
#!/bin/sh
echo A
sleep 20
echo B
echo C
sleep 40
echo D
Run Code Online (Sandbox Code Playgroud)
我看到的行为是 grep 在 20 秒后退出,但是尾部将需要另外 40 秒才能死亡。我理解为什么会发生这种情况 - tail 只会在写入管道时注意到管道消失了,这仅在数据附加到文件时发生。由于 tail 将缓冲数据并将 B 和 C 字符作为单个写入输出(我通过 strace 确认了这一点)这一事实使情况更加复杂。我试图用我在其他地方找到的解决方案来解决这个问题,例如使用 unbuffer 命令,但这没有帮助。
有人对如何按照我的预期进行工作有任何想法吗?或者等待Tomcat成功启动的想法(考虑等待TCP端口知道它已经启动,但怀疑这会变得比我现在想要做的更复杂)。我已经设法让它与 awk 一起工作,在比赛中做一个“killall tail”,但我对这个解决方案不满意。注意我试图让它在 RHEL4 上工作。
像这样的东西?
mkfifo child.fifo
tail -f child.out > child.fifo &
pid=$!
grep -q B child.fifo && kill $pid
Run Code Online (Sandbox Code Playgroud)
在全:
#!/bin/sh
rm -f child.out
./child.sh > child.out &
mkfifo child.fifo
tail -f child.out > child.fifo &
pid=$!
grep -q B child.fifo && kill $pid
rm child.fifo
Run Code Online (Sandbox Code Playgroud)
似乎在 20 秒内运行。
$ time ./test2.sh
real 0m20.156s
user 0m0.033s
sys 0m0.058s
Run Code Online (Sandbox Code Playgroud)
更新
这种方式似乎也有效:
#!/bin/sh
rm -f child.out
./child.sh > child.out &
(tail -f child.out | grep -q B child.out)
Run Code Online (Sandbox Code Playgroud)
如果您有时看到它立即退出,请尝试添加 sleep 1,即
#!/bin/sh
rm -f child.out
./child.sh > child.out &
sleep 1
(tail -f child.out | grep -q B child.out)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5859 次 |
| 最近记录: |