0

我有一个这样的 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 正常完成其工作,无需被杀死,但脚本不会杀死 chromium 并且不会继续执行其余代码。

有没有办法检测一个步骤是否花费太长时间,然后简单地杀死所有东西并进入下一步?

更新

it is a long code

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

增加睡眠

它不会重现问题。

4

2 回答 2

2

如果您不介意进程非正常退出,您可以使用 SIGKILL 而不是 SIGHUP:

killall -9 chromium-browser
sudo killall tcpdump

但是,在这种情况下,最好捕获您已启动的进程的 pid 并仅终止这些进程(而不是终止所有 chromium-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

回答您的问题“有没有办法检测一个步骤是否花费太长时间,然后简单地杀死所有内容并进入下一步?” 我建议timeout在 coreutils 中使用该实用程序。

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 &
于 2012-11-21T14:17:10.280 回答
0
sudo tcpdump -Z root -w dump.pcap -n -i eth0 -G 300 -W 1
G - 超时秒数(超时后命令自动被杀死)

Z - 删除 root 并以用户权限运行

W - 要保存的文件数量(作为拆分文件)
于 2015-03-04T08:45:02.893 回答