在谷歌的帮助下,测量多播流带宽的脚本。
这里是
tcpdump -tnn -i eth1 -f multicast | sort | uniq -c | awk '{print $3,"> "$5,$1*$NF/2*8/1024 " Kbps"}' | awk '$1 > 10' & sleep 2s && pkill -HUP -f tcpdump
结果很好,只是我需要按回车键才能返回提示。我知道这是 && 的问题,但不知道如何修复它。
我如何将其转录为 shell 脚本。也许可以添加 $var 来表示秒数。
答案1
尝试timeout
在一段时间后终止 tcpdump:
(timeout -s HUP 2 tcpdump -tnn -i eth1 -f multicast || true) | sort | uniq -c | awk '{print $3,"> "$5,$1*$NF/2*8/1024 " Kbps"}' | awk '$1 > 10'
编写脚本:
#!/bin/bash
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "Usage: $0 <number of seconds>"
exit 1
fi
(timeout -s HUP $1 tcpdump -tnn -i eth1 -f multicast || true) | sort | uniq -c | awk '{print $3,"> "$5,$1*$NF/2*8/1024 " Kbps"}' | awk '$1 > 10'
答案2
您不需要按回车键退出。这只是一个外观问题。这是因为您的输出“覆盖”了您的终端(您仍然可以输入任何命令并按回车键 - 它将被执行)。
要“修复”此布局问题,您可以尝试将“;sleep 1;echo”附加到您的行,使其看起来像这样:
tcpdump -tnn -i eth1 -f multicast | sort | uniq -c | awk '{print $3,"> "$5,$1*$NF/2*8/1024 " Kbps"}' | awk '$1 > 10' & sleep 2s && pkill -HUP -f tcpdump; sleep 1; echo
希望有所帮助。
这是带有变量的 bash 脚本:
#!/bin/bash
SLEEPTIME=5
tcpdump -tnn -i eth0 -f multicast | sort | uniq -c | awk -v a=$SLEEPTIME '{print $3,"> "$5,$1*$NF/a*8/1024 " Kbps"}' | awk '$1 > 10' & sleep $SLEEPTIME && pkill -HUP -f tcpdump; sleep 1; echo