我想编写一个bash脚本来计算网络接口捕获数据包的平均时间。我找到这个答案给了我帮助,但我需要改进我的脚本。所以我以这种方式扩展了它
#!/bin/bash
INTERVAL="1" # interval in seconds
if [ -z "$1" ]; then
echo
echo usage: $0 [network-interface]
echo
echo e.g. $0 "$1"
echo
echo shows packets-per-second
exit
fi
N_PPS=0
SUM_TIME=0
calc_avg()
{
AVG=$((N_PPS/SUM_TIME))
echo
echo "The average of packet captured is $AVG pkts/s"
exit 0
}
trap calc_avg SIGINT
while true
do
R1=`cat /sys/class/net/$1/statistics/rx_packets`
sleep $INTERVAL
R2=`cat /sys/class/net/$1/statistics/rx_packets`
RXPPS=`expr $R2 - $R1`
SUM_TIME=$((SUM_TIME + 1))
if [ "$RXPPS" > 0 ];
then
N_PPS=$((N_PPS + RXPPS))
fi
echo "RX $1: $RXPPS pkts/s"
done
正如我所解释的那样,我需要捕获数据包的 AVG 时间,所以我用 N_PPS
来计算我的数据包。我需要更好地了解这个计算是否正确,无论是SUM_TIME
还是AVG_TIME
,以及如何在 bash 中使用微秒而不是秒。
任何建议或批评都很好接受。
更改后编辑
由于@jarr答案,我做了更改,但我遇到了问题,如果结果是更少的 han 1,则不显示初始
0
. 即AVG = .333
AVG=$(echo "scale=3;$N_PPS/$SUM_TIME" |公元前 )
我注意到当我启动此脚本时,它会创建一个名为 0 的 0 字节的文件。为什么以及如何避免这种情况?
代码在数学上似乎是正确的,但当然它可能缺乏数据收集变量$INTERVAL的准确性。也许它可以设置为参数?但这取决于您的需求。这里完成了一些快速优化。
一些观点(根据我的经验,也许其他人可以指出一些不必要的更改)。
我更喜欢 printf而不是回显,因为它允许更多的控制。另外,我不久前在某处读到它更便携。
您不需要 expr 即可将命令评估为变量。
我个人更喜欢用法进入它自己的功能以增加可读性。该函数应返回一个成功值,因为其调用是预期的,它并不完全是一个错误。
双括号可用于将变量添加到自身。
#!/bin/bash
INTERVAL="1" # interval in seconds
N_PPS=0
SUM_TIME=0
trap calc_avg SIGINT
fn_usage()
{
printf "nusage: $0 [network-interface]n"
printf "ne.g. $0 $1n"
printf "nshows packets-per-secondn"
exit 0
}
calc_avg()
{
AVG=$((N_PPS/SUM_TIME))
printf "nThe average of packet captured is $AVG pkts/sn"
exit 0
}
if [[ -z $1 ]]; then
fn_usage
fi
while true; do
R1=$( cat /sys/class/net/$1/statistics/rx_packets )
sleep $INTERVAL
R2=$( cat /sys/class/net/$1/statistics/rx_packets )
RXPPS=$(( $R2 - $R1 ))
((SUM_TIME += 1))
if [[ $RXPPS > 0 ]]; then
((N_PPS += RXPPS))
fi
printf "RX $1: $RXPPS pkts/sn"
done