我使用以下脚本来计算已建立的连接数,以及特定范围的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
逻辑。