1. 程式人生 > >該死的端口占用!教你用 Shell 指令碼一鍵幹掉它!

該死的端口占用!教你用 Shell 指令碼一鍵幹掉它!

## 1\. 前言 大家好,我是安果! 在 Web 開發中,經常會遇到「埠被佔用」的場景 常規解決方案是: * 使用 lsof -i 命令查詢佔用埠的程序 PID * 利用 kill -9 PID 幹掉目標程序 雖然只有 2 步,我也覺得很繁瑣,即:既要記住命令,又要輸入兩次 本篇文章將編寫 Shell 指令碼,來實現一鍵幹掉端口占用 ## 2. 實現 相比 Python,Shell 指令碼常用於處理偏作業系統底層的業務,簡單、開發效率高 以 Mac OSX 為例,在本地建立一個 .sh 檔案,實現步驟如下: 2-1  定義埠號及過濾內容引數 將要處理的埠號及命令列過濾內容引數化,然後在 Shell 指令碼中賦值給兩個變數 * $1 執行指令碼的第一個引數,即:埠號 * $2 執行指令碼的第二個引數,即:過濾程序命令內容 ``` # 要幹掉的埠號 port_be_kill=$1 # 過濾內容 filter_content=$2 ``` 2-2  獲取端口占用程序返回值 使用埠號組成 lsof -i 命令,執行這條命令,將返回值賦值給變數 ip_status ``` # 獲取Shell返回值 ip_cmd='lsof -i tcp:'$port_be_kill echo "獲取埠號對應的程序命令:"$ip_cmd echo "過濾命令字串為:"$filter_content # 執行命令 ip_status=`$ip_cmd` ``` 注意:ip_status 資料型別為字串 2-3  轉為陣列 由於字串不便於 PID 過濾,我們需要將上面的 ip_status 變數按「空格」分割成一個數組 ``` # 以空格來分隔,轉為一個數組變數 array=(${ip_status// / }) ``` 2-4  遍歷陣列,過濾 PID 首先,遍歷上面的陣列,提取每一個元素 然後,過濾出所有型別為 number、並且上一個值包含過濾內容的資料 ``` # 判斷資料的型別 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 命令處理對應的程序 ``` # 遍歷陣列 for i in "${!array[@]}"; do # 注意:賦值等號=前後不能有空格 item="${array[i]}" # 注意:過濾十六進位制字串 # 先轉為字串,然後判斷是否以0x開頭 # echo $item if [[ $item != 0x* ]] then # 非十六進位制資料,即:PID if [ $(check $item) = "integer" ] then # 判斷上一個元素是否包含關鍵字 # 命令列是否包含關鍵字 item_pre="${array[i-1]}" # echo $item_pre # echo $filter_content if [[ $item_pre =~ $filter_content ]] then # echo $item # 呼叫kill-9 pid命令幹掉程序 kill_cmd="kill -9 "$item echo $kill_cmd # 執行命令,幹掉程序 $kill_cmd fi fi fi done ``` 2-5  設定 Alias 為了一鍵執行 Shell 指令碼,我們使用 Alias 給命令設定一個別名 修改「.bash_profile」檔案,將 Shell 指令碼檔案的完整路徑及執行命令寫入到一個自定義的函式中 ``` # vim .bash_profile # alias定義 kill_port() { cd /Users/xingag/Desktop/work ./kill_port_with_args.sh $1 $2 } alias kp=kill_port ``` 2-6  實戰一下 使用 source .bash_profile 命令重新整理配置檔案,讓 Alias 配置立即生效 假如現在 8000 被佔用,我們只需要開啟終端輸入「kp 8000 python」命令即可以快速幹掉目標程序 執行截圖如下: ![image](https://upload-images.jianshu.io/upload_images/1466987-be4059b3fc234e47?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 4\. 最後 需要指出的是,Linux 下需要預先安裝 lsof 命令,以 CentOS 為例 ``` # Centos安裝lsof yum install lsof ``` 如果是 Windows,處理端口占用的 Shell 指令碼不一樣;它需要使用 netstat/tasklist/taskkill 命令去改寫 另外,PC 端執行 Shell 指令碼建議使用 Git Bash ``` # Win處理端口占用 # 1、開啟cmd終端 cmd # 2、查詢端口占用的程序及PID netstat -aon|findstr PORT # 3、根據PID查詢程序名稱 tasklist|findstr PID # 4、使用taskkill命令或在工作管理員中關掉程序 ``` 我已經將文中完整原始碼檔案傳到後臺,關注公眾號「 **AirPython** 」,後臺回覆「 **kp** 」即可獲得 如果你覺得文章還不錯,請大家 **點贊、分享、留言** 下,因為這將是我持續輸出更多優質文章的最強動力!