bash脚本没有退出

时间:2017-06-29 17:36:33

标签: linux bash

我编写了一个快速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并退出。除了尾部过程似乎没有被杀死,脚本本身也没有。

2 个答案:

答案 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条件。一旦满足,整个脚本/过程就会退出。