我使用以下脚本来计算已建立的连接数,以及特定范围的TCP端口的等待时间状态。
该脚本使用netstat和egrep尝试筛选出有效的连接。脚本还从文件中读取输入,并计算观察到的连接数。

#!/bin/bash
START=121
END=9089

[ -f /tmp/ports.txt ] && rm -f /tmp/ports.txt

for ((a=$START; a <= $END; a++)); do
    netstat -an | nawk '/TIME_WAIT|ESTABLISHED/ && !/127.0.0.1/{split($4,a,".");print a[5]}' | egrep -c ^${a}$ | \
    awk -v x=$a '\
    $0 != 0 {printf("%d %d\n",x,$0)}' | tee -a /tmp/ports.txt
done

awk -v s=$START -v e=$END '\
    BEGIN{t=0}
    {t=t+$2}
    END{printf("\nTotal Connections on ports %d-%d: %d\n",s,e,t)}' /tmp/ports.txt

rm -f /tmp/ports.txt

我正在寻找提高脚本性能的方法。对于当前端口范围(121-9089),完成大约需要77秒。
我正在寻找提高性能的建议以及一个示例脚本。

最佳答案

您运行netstat -an超过8000次,每次只提取一个端口。
我会用不同的逻辑来改变你的主回路:

netstat -na | grep -E "TIME_WAIT|ESTABLISHED" | while read line; do
    port=`echo $line | awk -F":" ' { print $2 }' | awk ' { print $1 }'` #<--- get here your port
    [ $port -ge $START ] && [ $port -le $END ] && echo $line | tee -a /tmp/ports.txt #<---- put only the selected range
 done

这样你只会netstat一次。
注意,您需要更改我的示例中的awk逻辑。

10-04 13:19