echo "* 1.链接状态分析"
echo "* 2.进程打开句柄数分析"
echo "* 3.系统打开句柄数最多的进程分析"
echo "* 4.显示系统ipc"
echo "请输入:"
read num
clear
case "$num" in
1)
echo "请输入ip地址:"
read myip
echo "要分析的ip地址是:$myip"
netstat -ant | awk '/'$myip'/ {print $0; ++y[$NF]} END {printf "---------------------------------\n";for(w in y) printf "%-12s %4d\n", w, y[w]}'
;;
2)
echo "请输入进程PID:"
read pid
ls /proc/$pid/fd | wc -l
;;
3)
echo "PID CMD"
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | sed -n 1,5p > temp
awk '{print $2}' temp > temps
for i in `cat temps`
do
cmd=`ps -p $i | awk '$1 ~ /'$i'/ {print $NF}'`
echo "$i $cmd"
done
;;
4)
ipcs
;;
esac
其中有一些语法的注意点,
1、
netstat -ant | awk '/'$myip'/ {print $0; ++y[$NF]} END {printf "---------------------------------\n";for(w in y) printf "%-12s %4d\n", w, y[w]}'
awk查找的时候如果引用变量,需要‘’,加单引号;
$0代表整行;
NF代表一行字段数目,$NF就是最后一个字段;
awk中 BEGIN代表所有行操作之前做的事,END代表所有行操作结束后做的事
2、
显示进程打开的句柄数时,有两种方法
ls /proc/pid/fd
lsof -p pid
因为lsof会有重复计算的原因,所以显示的数目总是比ls的方式要多,这里参考文章句柄查找优化
未完待续~~~