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