我编写了一个快速bash脚本,它监视特定字符串的日志然后退出。除了问题是我仍然可以写脚本及其孩子" tail"当我执行" ps -fu $ user"。
时脚本返回后运行的进程#!/bin/bash
####### MAIN #######
FILE=$1
MSG=""
while read LOGLINE
do
if [[ "${LOGLINE}" == *"someString"* ]]; then
MSG=${LOGLINE}
break
fi
done < <(tail -f ${FILE})
pkill -P $$ tail
echo ${MSG}
我从一个连续写入的应用程序传递一个日志文件。当我运行此脚本时,它将找到 someString 的第一个实例,将其回显到stdout并退出。除了尾部过程似乎没有被杀死,脚本本身也没有。
答案 0 :(得分:1)
理解为什么会发生这一点非常重要。
问题是用于退出循环的“break”。 break在if语句中。退出在这里更合适,因为你想要一起退出。
此部分也不是必需的,你只需要以“完成”结束
完成&lt; &lt;(tail -f $ {FILE})
你永远不会“完成”“尾巴”,因为你从来没有首先要求它。
因为我假设您的日志在脚本开头没有中继,所以您正在寻找新内容,因此您应该管道/或写入临时文件尾部,然后在退出脚本时删除。要么会奏效。
答案 1 :(得分:0)
#!/bin/bash
####### MAIN #######
FILE=$1
MSG=""
tail -f ${FILE} | while read LOGLINE
do
if [[ "${LOGLINE}" == *"someString"* ]]; then
MSG=${LOGLINE}
exit
fi
done
上述解决方案从尾部逐行读取输出,直到满足if条件。一旦满足,整个脚本/过程就会退出。