Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么bash脚本停止工作_Bash_Shell_Fifo_Tail - Fatal编程技术网

为什么bash脚本停止工作

为什么bash脚本停止工作,bash,shell,fifo,tail,Bash,Shell,Fifo,Tail,该脚本监视传入的HTTP消息,并将它们转发给一个名为zabbix的监视应用程序,它可以正常工作,但大约1-2天后就会停止工作。以下是到目前为止我所知道的: 使用pgrep我看到脚本仍在运行 日志文件得到正确更新(脚本的第一个命令) 先进先出管道似乎在工作 问题一定在WHILE循环或tail命令中的某个地方。 我是个脚本新手,所以也许有人能马上发现问题 #!/bin/bash tcpflow -p -c -i enp2s0 port 80 | grep --line-buffered -oE

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

  • 使用
    pgrep
    我看到脚本仍在运行
  • 日志文件得到正确更新(脚本的第一个命令)
  • 先进先出管道似乎在工作
问题一定在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
#/bin/bash
tcpflow-p-c-i enp2s0端口80 | grep-缓存线-oE'boo.php.*HTTP/1.[01]>/usr/local/bin/logfile&
管道=/tmp/fifoppe
陷阱“rm-f$管道”出口
如果[!-p$pipe]];然后
mkfifo$管道
fi
tail-n0-F/usr/local/bin/logfile>/tmp/fifoppe&
虽然是真的
做

如果读取行您从fifo输入不正确。以书面形式:

while true; do read line < $pipe ....; done
为true时;请务必阅读第行<$pipe。。。。;完成
在循环的每次迭代中,您都要关闭并重新打开fifo。第一次关闭它时,管道的生产者(tail-f)得到一个SIGPIPE并死亡。将结构更改为:

while true; do read line; ...; done < $pipe
为true时;读一行。。。;完成<$pipe

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

在哪里为变量$host赋值?这可能会有所帮助:我简化了脚本,只是为了在此处发布,我确实分配了它。修正了Post从工作状态到不工作状态的变化?当时是否有人对这个脚本进行了更改?如果是的话,你的风投展示了什么?旧版本的脚本仍然有效吗?或者,如果脚本在此期间没有更改,您凭什么认为更改脚本可以解决问题?(如果手动运行
zabbix_sender
命令,会发生什么情况?)没有任何更改。脚本运行平稳,HTTP消息被发送到zabbix,1-2天后甚至没有登录到服务器,它就停止工作了。”zabbix_sender的手动工作正常。我按照您所描述的重新安排了循环。我想我能在几天内看到这是否解决了问题。但是如何关闭每个进程的stdin呢?您还可以通过fd#3而不是stdin(又称fd#0)来避免其他进程从管道读取数据的问题:
而不是true;请阅读@tarmogr行以关闭,您可以执行
现在似乎工作正常,谢谢大家的输入!