在我的 bash 脚本中,如何编写仅在 "tail" 的输出不包含字符串时才存在的 while 循环?

In my bash script, how do I write a while loop that only exits if the output of "tail" doesn't contain a string?

我正在使用亚马逊 Linux 和 bash shell。在我的 bash 脚本中,我如何构造一个 while 循环,只要命令

tail -10 /usr/java/jboss/standalone/log/server.log

不包含字符串“FrameworkServlet‘myprojectDispatcher’:初始化完成”?

您可以使用:

tail -n 10 -f /usr/java/jboss/standalone/log/server.log |
awk '/FrameworkServlet.*myprojectDispatcher.*initialization completed/{exit} 1'

awk 遇到搜索字符串时会退出,否则会继续将输入写入标准输出。

但是请记住,tail 命令是缓冲的,要避免这种行为,请尝试 stdbuf gnu 实用程序:

stdbuf -i0 -o0 -e0 tail -n 10 -f /usr/java/jboss/standalone/log/server.log |
awk '/FrameworkServlet.*myprojectDispatcher.*initialization completed/{exit} 1'

我可以试试这个:

#!/bin/bash

MATCH="FrameworkServlet ‘myprojectDispatcher': initialization completed"

while :
do
    if tail /usr/java/jboss/standalone/log/server.log | grep -q "$MATCH"; then
        exit 0
    else
        sleep 1
    fi
done
while [ -nz grep -q "FrameworkServlet ‘myprojectDispatcher': initialization completed" /usr/java/jboss/standalone/log/server.log ]; do
  # wait a second
  sleep 1
done
# do the stuff
echo "we got it!"