用netstat命令輸出端口和對應的pid


    今天遇到一個問題,為了殺掉打開了某些端口的進程,我們一般是先用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不久,有不到的地方望高手指點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM