今天遇到一个问题,为了杀掉打开了某些端口的进程,我们一般是先用netstat命令找到指定端口对应的进程,再kill掉,这里面就有两个操作:netstat和kill。而我们的系统会打开很多端口,而且是集群环境,不可能一个节点一个节点地去检查每个端口后再杀掉,遂写了个自动脚本,指定端口后执行此脚本就可以杀掉打开这些端口的进程。
脚本首先是用netstat找出端口和pid,习惯使用-tnlp,如下图
输出的内容有点多,但我们只需要红色部分圈出的port和pid,所以需要作一些处理,很简单,head、tail、cut、awk、grep这些工具组合咯
netstat -tlnp | tail -n +3 | awk '{print $4"|"$7}' | grep '[0-9]\+|[0-9]\+' -o
可以得到的结果:
“|”前面的数字表示port,后面即pid。得到这些后下面的工作就简单了。下面是完整的脚本
#!/bin/sh ARR_PORTS=( 40008 90002 23001 14000 ) check_port() { i=0 length=${#ARR_PORTS[*]} while [ $i -lt $length ] ; do if [ $1 -eq ${ARR_PORTS[$i]} ]; then return 1 fi let i++ done return 0 } TMP_FILE=pp.tmp netstat -tlnp | tail -n +3 | awk '{print $4"|"$7}' | grep '[0-9]\+|[0-9]\+' -o > $TMP_FILE for line in `cat $TMP_FILE`; do port=`echo $line | cut -d '|' -f 1` pid=`echo $line | cut -d '|' -f 2` check_port $port ret=$? if [ $ret -eq 1 ]; then #echo "will kill $port|$pid" kill -9 $pid fi done rm -rf $TMP_FILE
刚学shell不久,有不到的地方望高手指点。