为什么bash脚本停止工作

时间:2017-10-29 12:09:47

标签: bash shell fifo tail

该脚本监视传入的HTTP消息并将它们转发到名为zabbix的监视应用程序,它工作正常,但是大约1-2天后它就会停止工作。到目前为止,我所知道的是:

  • 使用pgrep我看到脚本仍在运行
  • 日志文件文件正确更新(脚本的第一个命令)
  • FIFO管道似乎正在运作

问题必须在WHILE循环或tail命令中。 我是脚本新手,所以也许有人可以立即发现问题?

#!/bin/bash
tcpflow -p -c -i enp2s0 port 80 | grep --line-buffered -oE 'boo.php.* HTTP/1.[01]' >> /usr/local/bin/logfile &

pipe=/tmp/fifopipe

trap "rm -f $pipe" EXIT

if [[ ! -p $pipe ]]; then
        mkfifo  $pipe
fi

tail -n0 -F /usr/local/bin/logfile > /tmp/fifopipe &

while true
do
    if read line <$pipe; then

        unset sn

        for ((c=1; c<=3; c++)) # c is no of max parameters x 2 + 1
        do
                URL="$(echo $line | awk -F'[ =&?]' '{print $'$c'}')"

                if [[ "$URL" == 'sn' ]]; then
                ((c++))
                sn="$(echo $line | awk -F'[ =&?]' '{print $'$c'}')"
                fi

        done

        if [[ "$sn"  ]]; then
                        hosttype="US2G_"
                        host=$hosttype$sn
                        zabbix_sender -z nuc -s $host -k serial -o $sn -vv
        fi
    fi
done

1 个答案:

答案 0 :(得分:3)

您正在从fifo输入错误。写下:

while true; do read line < $pipe ....; done

您正在关闭并在循环的每次迭代中重新打开fifo。第一次关闭它时,生产者到管道(tail -f)得到一个SIGPIPE并死掉。将结构更改为:

while true; do read line; ...; done < $pipe

请注意,循环中的每个进程现在都有可能无意中从管道中读取,因此您可能希望为每个进程显式关闭stdin。