我有一个类似这样的bash脚本:
#!/bin/bash
while true; do
sudo tcpdump -i eth0 -w dump.pcap -c 1500 &
chromium-browser --app http://domain.com &
sleep 60
killall chromium-browser
sudo killall tcpdump
# do some stuff with pcap file
# it basically converts the pcap to plain text using tshark
# then a PHP script parses the plain text
sleep 240
done
它运行良好。但有时,无论出于何种原因,都不会有任何东西被杀死,脚本也会陷入循环步骤。它实际上什么都不做,没有占用任何资源。剧本似乎在等待什么东西被杀死。
我尝试过限制tcpdump捕获的数据包,但没有成功。tcpdump可以正常完成它的工作,而不必被杀死,但脚本不会杀死chrome,也不会继续执行其余的代码。
有没有什么方法可以检测一步是否花费了太长时间,然后简单地杀死所有东西并进入下一步?
更新
it is a long code
它使用tsark将pcap文件转换为纯文本,PHP脚本解析纯文本。问题不在这一部分,因为tshark从未被调用,PHP脚本也从未被调用。在此之前一切都停止了。
增加睡眠
它并没有重现这个问题。
如果您不介意进程非正常退出,您可以使用SIGKILL而不是SIGHUP:
killall -9 chromium-browser
sudo killall tcpdump
然而,在这种情况下,最好捕获已启动进程的pid,并仅终止这些进程(而不是终止所有chromium brower和tcpdump实例)。
您可以使用$!访问上次运行进程的pid!。
sudo tcpdump -i eth0 -w dump.pcap -c 1500 &
tcpdump_pid=$!
chromium-browser --app http://domain.com &
chromium-browser_pid=$!
sleep 60
kill -9 $tcpdump_pid
sudo kill $chromium-browser_pid
为了回答您的问题"是否有任何方法可以检测一个步骤是否花费了太长时间,并简单地终止所有内容并进入下一步?"我建议在coreutils中使用timeout
实用程序。
timeout 5 sudo kill -9 $chromium-browser_pid
尽管明智的做法是确定挂起的原因,而不是解决它,否则您将面临资源泄漏。从超时角度来看,重写循环会更整洁:
sudo timeout 60 tcpdump -i eth0 -w dump.pcap -c 1500 &
timeout 60 chromium-browser --app http://domain.com &
sudo tcpdump-Z root-w dump.pcap-n-i eth0-G 300-w 1
G-超时秒数(超时后命令自动终止)Z-删除根并以用户权限运行W-要保存的文件数(作为拆分文件)