2

我有一个循环脚本:

until [ $n -eq 0 ]
do
    tcpdump -i eth0 -c 1000000 -s 0 -vvv -w /root/nauvoicedump/`date "+%Y-%m-%d-%H-%M"`.pcap
    n=$(($n-1))
    echo $n 'times left'
done

我想了解如何停止执行此脚本?<CTRL> + <C>仅停止循环的以下迭代。

4

2 回答 2

3

SIGINT不会终止“循环的后续迭代”。相反,当您键入 ctrl-C 时,您正在向SIGINT当前运行的 tcpdump 实例发送 a,并且循环在它终止后继续。避免这种情况的一个简单方法是SIGINT在 shell 中捕获:

trap 'kill $!; exit' INT
until [ $n -eq 0 ]
do
    tcpdump -i eth0 -c 1000000 -s 0 -vvv -w /root/nauvoicedump/`date "+%Y-%m-%d-%H-%M"`.pcap&
    wait
    n=$(($n-1))
    echo $n 'times left'
done

请注意,您需要在后台运行 tcpdump(附加&到启动它的行)才能使其正常工作。如果您有其他后台作业正在运行,您可能需要wait $!而不仅仅是wait.

于 2013-09-23T14:20:17.843 回答
1

您应该将 n 的起始值设置为至少比 0 大 1。示例:

n=100
until [ "$n" -eq 0 ]
...

正确引用变量也是一个好习惯。

如果您使用 for 循环也可能会更好:

for (( n = 100; n--; )); do
    tcpdump -i eth0 -c 1000000 -s 0 -vvv -w "/root/nauvoicedump/$(date '+%Y-%m-%d-%H-%M').pcap"
    echo "$n times left"
done
于 2013-09-23T14:15:30.300 回答