限制循环中的步骤执行

时间:2012-11-21 14:04:09

标签: bash loops

我有一个像这样的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正常完成其工作,而不必被杀死,但脚本不会杀死铬,并且不会继续使用其余的代码。

有没有办法检测步骤是否花费太长时间并简单地杀死所有内容并转到下一步?

更新

it is a long code

它使用tshark将pcap文件转换为纯文本,PHP脚本解析纯文本。问题不在于此部分,因为从未调用过tshark,也没有调用PHP脚本。在那之前一切都停止了。

增加睡眠

它不会重现问题。

2 个答案:

答案 0 :(得分:2)

如果您不介意非优雅地退出流程,您可以使用SIGKILL而不是SIGHUP:

killall -9 chromium-browser
sudo killall tcpdump

但是在这种情况下,最好捕获已经开始的进程的pid,并且只杀死那些(而不是杀死所有的chrome-browers和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 &

答案 1 :(得分:0)

sudo tcpdump -Z root -w dump.pcap -n -i eth0 -G 300 -W 1 
G - Timeout Seconds (After timeout period the comman gets killed automatically)

Z - drop root and runs as user privilege

W - Number files to be saved (as a splitted file)