是否可以编写在特定文件中出现给定行之前不会继续的脚本?
例如,我想做这样的事情:
CANARY_LINE='Server started'
FILE='/var/logs/deployment.log'
echo 'Waiting for server to start'
.... watch $FILE for $CANARY_LINE ...
echo 'Server started'
Run Code Online (Sandbox Code Playgroud)
基本上,一个 shell 脚本,它监视文件的行(或正则表达式)。
小智 19
tail -f path_to_my_log_file.log | sed '/particular_line/ q'
Run Code Online (Sandbox Code Playgroud)
q您可以在通过 解析输入时使用该标志sed。然后一旦出现sed就会中断。tailServer started/var/logs/deployment.log
tail -f /var/logs/deployment.log | sed '/Server started/ q'
Run Code Online (Sandbox Code Playgroud)
做同样事情的另一种方法
( tail -f -n0 /var/logs/deployment.log & ) | grep -q "Server Started"
Run Code Online (Sandbox Code Playgroud)
上一个答案(有效,但不如这个有效)
我们必须小心循环。
例如,如果您想检查文件以启动算法,您可能必须执行类似的操作:
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
Run Code Online (Sandbox Code Playgroud)
但是,为了防止无限循环,您应该添加一些界限:
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
Run Code Online (Sandbox Code Playgroud)