CANARY_LINE='Server started'
FILE='/var/logs/deployment.log'
echo 'Waiting for server to start'
.... watch $FILE for $CANARY_LINE ...
echo 'Server started'
FILE_TO_CHECK="/var/logs/deployment.log"
LINE_TO_CONTAIN="Server started"
SLEEP_TIME=10
while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
do
sleep ${SLEEP_TIME}
done
# Start your algorithm here
但是,为了防止无限循环,您应该添加一些绑定:
FILE_TO_CHECK="/var/logs/deployment.log"
LINE_TO_CONTAIN="Server started"
SLEEP_TIME=10
COUNT=0
MAX=10
while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") -a ${COUNT} -lt ${MAX} ]
do
sleep ${SLEEP_TIME}
COUNT=$(($COUNT + 1))
done
if [ ! $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
then
echo "Let's go, the file is containing what we want"
# Start your algorithm here
else
echo "Timed out"
exit 10
fi
#!/bin/bash
canary_line='Server started'
file='/var/logs/deployment.log'
echo 'Waiting for server to start'
until grep -q "${canary_line}" "${file}"
do
sleep 1s
done
echo 'Server started'
4条答案
按热度按时间bvn4nwqk1#
fxnxkyjh2#
您可以在通过
sed
解析输入时使用q
标志。这样,一旦Server started
出现在/var/logs/deployment.log
中,sed
就会中断tail
。做同样事情的另一种方法
上一个答案(有效,但不如此答案有效)
我们必须小心循环。
例如,如果你想检查一个文件来启动一个算法,你可能必须做这样的事情:
但是,为了防止无限循环,您应该添加一些绑定:
dxpyg8gm3#
来源:改编自How to wait for message to appear in log in shell
mzmfm0qo4#
试试这个:
根据您的口味调整
sleep
的参数。如果文件中的行需要 * exactly * 匹配,即整行,则将
grep
的第二个参数更改为"^${canary_line}$"
。grep
认为特殊的字符,您将不得不以某种方式解决该问题。