“tail -f | grep -q”作为触发器,而不用担心之前找到的

“tail -f | grep -q”作为触发器,而不用担心之前找到的

目前,查看 Tomcat 是否已完全启动的唯一方法是检查 apache-tomcat 日志:

tail -f ./catalina.out

并在我做任何工作之前寻找这种模式的出现。

org.apache.catalina.startup.Catalina.start Server startup in [0-9]* ms

我想自动化该过程并编写了下面的脚本,该脚本确实有效。

tail -f ./catalina.out | egrep -q '*.Catalina.start Server startup in [0-9]* ms$' 
touch done

但问题是它有时会读取之前的启动并立即完成。


期望的过程:

Tomcat 停止 -> Tomcat 重新启动 -> tail shell 运行 -> Tomcat 完全启动 -> shell 告诉我它已经完成


我的脚本可能会做什么:

Tomcat 停止 -> Tomcat 重新启动 -> tail shell 运行 -> 由于之前的日志,它立即告诉我 Tomcat 已完全启动。

我该如何实现这一目标?

答案1

默认情况下tail -f读取最后 10 行,然后开始后续操作。您可以使用-n覆盖该数字,因此tail -n0 -f 从当前末尾开始,忽略任何较早的内容,然后遵循新的更改。

请注意,如果您运行:

start tomcat in some way
tail -n0 -f logfile | grep -q

您依赖于 tomcat 足够慢,以便tail在 tomcat 写入告诉它启动的行之前有时间启动。通常情况下可能是这样,但是脚本可能会被安排为在tail运行之前有任意长的延迟。所以,实际上,你应该以某种方式安排tail先开始。

我可以想象这样的事情,但我不确定:

tail -n0 -f logfile | grep -q &
pid=$!
start tomcat in some way
wait "$pid"

另外,还有一个小问题,当grep -q它看到匹配的行时退出,但这不会导致tail退出。仅当它看到管道关闭时才会tail退出,并且只有当它尝试再次写入管道时(下次新内容出现在文件中时)才会退出。

当然,如果文件不断填充新条目,这种情况很快就会发生。

相关内容