該死的端口占用!教你用 Shell 腳本一鍵干掉它筹煮!

1. 前言

大家好遮精,我是安果!

在 Web 開發(fā)中败潦,經(jīng)常會遇到「端口被占用」的場景

常規(guī)解決方案是:

  • 使用 lsof -i 命令查詢占用端口的進程 PID

  • 利用 kill -9 PID 干掉目標進程

雖然只有 2 步本冲,我也覺得很繁瑣,即:既要記住命令劫扒,又要輸入兩次

本篇文章將編寫 Shell 腳本檬洞,來實現(xiàn)一鍵干掉端口占用

2. 實現(xiàn)

相比 Python,Shell 腳本常用于處理偏操作系統(tǒng)底層的業(yè)務(wù)沟饥,簡單添怔、開發(fā)效率高

以 Mac OSX 為例,在本地創(chuàng)建一個 .sh 文件贤旷,實現(xiàn)步驟如下:

2-1 定義端口號及過濾內(nèi)容參數(shù)

將要處理的端口號及命令行過濾內(nèi)容參數(shù)化广料,然后在 Shell 腳本中賦值給兩個變量

  • $1

    執(zhí)行腳本的第一個參數(shù),即:端口號

  • $2

    執(zhí)行腳本的第二個參數(shù)幼驶,即:過濾進程命令內(nèi)容

# 要干掉的端口號
port_be_kill=$1

# 過濾內(nèi)容
filter_content=$2

2-2 獲取端口占用進程返回值

使用端口號組成 lsof -i 命令艾杏,執(zhí)行這條命令,將返回值賦值給變量 ip_status

# 獲取Shell返回值
ip_cmd='lsof -i tcp:'$port_be_kill

echo "獲取端口號對應(yīng)的進程命令:"$ip_cmd
echo "過濾命令字符串為:"$filter_content

# 執(zhí)行命令
ip_status=`$ip_cmd`

注意:ip_status 數(shù)據(jù)類型為字符串

2-3 轉(zhuǎn)為數(shù)組

由于字符串不便于 PID 過濾盅藻,我們需要將上面的 ip_status 變量按「空格」分割成一個數(shù)組

# 以空格來分隔购桑,轉(zhuǎn)為一個數(shù)組變量
array=(${ip_status// / })

2-4 遍歷數(shù)組,過濾 PID

首先氏淑,遍歷上面的數(shù)組勃蜘,提取每一個元素

然后,過濾出所有類型為 number夸政、并且上一個值包含過濾內(nèi)容的數(shù)據(jù)

# 判斷數(shù)據(jù)的類型
function check(){
    local a="$1"
    printf "%d" "$a" &>/dev/null && echo "integer" && return
    printf "%d" "$(echo $a|sed 's/^[+-]\?0\+//')" &>/dev/null && echo "integer" && return
    printf "%f" "$a" &>/dev/null && echo "number" && return
    [ ${#a} -eq 1 ] && echo "char" && return
    echo "string"
}

最后元旬,使用 kill -9 PID 命令處理對應(yīng)的進程

# 遍歷數(shù)組
for i in "${!array[@]}"; do
    # 注意:賦值等號=前后不能有空格
    item="${array[i]}"

    # 注意:過濾十六進制字符串
    # 先轉(zhuǎn)為字符串,然后判斷是否以0x開頭
    # echo $item
    if [[ $item != 0x* ]]
    then
        # 非十六進制數(shù)據(jù),即:PID
        if [ $(check $item) = "integer" ]
        then
            # 判斷上一個元素是否包含關(guān)鍵字
            # 命令行是否包含關(guān)鍵字
            item_pre="${array[i-1]}"
            # echo $item_pre
            # echo $filter_content
            if [[ $item_pre =~ $filter_content ]]
            then
                # echo $item
                # 調(diào)用kill-9 pid命令干掉進程
                kill_cmd="kill -9 "$item
                echo $kill_cmd
                # 執(zhí)行命令匀归,干掉進程
                $kill_cmd
            fi
        fi
    fi  
done

2-5 設(shè)置 Alias

為了一鍵運行 Shell 腳本坑资,我們使用 Alias 給命令設(shè)置一個別名

修改「.bash_profile」文件,將 Shell 腳本文件的完整路徑及執(zhí)行命令寫入到一個自定義的函數(shù)中

# vim .bash_profile
# alias定義
kill_port() {
  cd /Users/xingag/Desktop/work
  ./kill_port_with_args.sh $1 $2
}
alias kp=kill_port

2-6 實戰(zhàn)一下

使用 source .bash_profile 命令刷新配置文件穆端,讓 Alias 配置立即生效

假如現(xiàn)在 8000 被占用袱贮,我們只需要打開終端輸入「kp 8000 python」命令即可以快速干掉目標進程

運行截圖如下:

image

4. 最后

需要指出的是,Linux 下需要預先安裝 lsof 命令体啰,以 CentOS 為例

# Centos安裝lsof
yum install lsof

如果是 Windows攒巍,處理端口占用的 Shell 腳本不一樣;它需要使用 netstat/tasklist/taskkill 命令去改寫

另外荒勇,PC 端執(zhí)行 Shell 腳本建議使用 Git Bash

# Win處理端口占用
# 1柒莉、打開cmd終端
cmd

# 2、查找端口占用的進程及PID
netstat -aon|findstr PORT

# 3沽翔、根據(jù)PID查詢進程名稱
tasklist|findstr PID

# 4兢孝、使用taskkill命令或在任務(wù)管理器中關(guān)掉進程

我已經(jīng)將文中完整源碼文件傳到后臺,關(guān)注公眾號「 AirPython 」仅偎,后臺回復「 kp 」即可獲得

如果你覺得文章還不錯跨蟹,請大家 點贊、分享橘沥、留言 下窗轩,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末座咆,一起剝皮案震驚了整個濱河市痢艺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箫措,老刑警劉巖腹备,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衬潦,死亡現(xiàn)場離奇詭異斤蔓,居然都是意外死亡,警方通過查閱死者的電腦和手機镀岛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門弦牡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漂羊,你說我怎么就攤上這事驾锰。” “怎么了走越?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵椭豫,是天一觀的道長。 經(jīng)常有香客問我,道長赏酥,這世上最難降的妖魔是什么喳整? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮裸扶,結(jié)果婚禮上框都,老公的妹妹穿的比我還像新娘。我一直安慰自己呵晨,他們只是感情好魏保,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摸屠,像睡著了一般谓罗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上季二,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天妥衣,我揣著相機與錄音,去河邊找鬼戒傻。 笑死税手,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的需纳。 我是一名探鬼主播芦倒,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼不翩!你這毒婦竟也來了兵扬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤口蝠,失蹤者是張志新(化名)和其女友劉穎器钟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妙蔗,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡傲霸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眉反。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙啄。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寸五,靈堂內(nèi)的尸體忽然破棺而出梳凛,到底是詐尸還是另有隱情,我是刑警寧澤梳杏,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布韧拒,位于F島的核電站淹接,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叛溢。R本人自食惡果不足惜蹈集,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雇初。 院中可真熱鬧拢肆,春花似錦、人聲如沸靖诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刊橘。三九已至鄙才,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間促绵,已是汗流浹背攒庵。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留败晴,地道東北人浓冒。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像尖坤,于是被迫代替她去往敵國和親稳懒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容