今天遇到一个问题,为了杀掉打开了某些端口的进程,我们一般是先用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不久,有不到的地方望高手指点。

 

posted on 2014-09-05 16:05  demin7926  阅读(14824)  评论(0编辑  收藏  举报