如何停止执行bash脚本?

时间:2013-09-23 14:12:58

标签: bash shell tcpdump

我有一个带循环的脚本:

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>仅停止循环的后续迭代。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您应该将n的起始值设置为至少高于0.示例:

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