背景
最近在做測試的時候,需要手動kill服務的進程,然后通過命令重啟服務,再進行測試。每次重啟都會涉及到下面三個命令的執行:
1)檢索進程ID
$ ps -eLf | grep programname
root 1123 112 1234 0 0 0 0:00:00 ? 00:00:00 programname xxx#ps: process status的縮寫
#-e 選項表示顯示所有進程(包括其他用戶的進程)。
#-L 選項表示顯示所有線程(如果進程是多線程的)。
#-f 選項表示顯示完整格式的進程信息,包括用戶、進程ID、父進程ID、CPU時間等。
#結果中第二個是PID(即進程ID)
2)kill進程
$ kill -9 1123# kill -9 強制終止進程
# 1123為上面獲取到的進程ID
3)重啟服務
$ xxx service start# 某個服務啟動命令
PS:為什么不在本地開發測試,因為需要GPU運行服務,所以需要有GPU的環境。目前比較笨的辦法是本地用開發工具修改之后,傳遞到GPU的服務器上運行,每次修改,都需要重啟一下服務以反映修改的代碼。
課題
雖然只有三個命令,每次都要執行三次,還要拷貝PID,次數多了也費時間,還容易出錯。
改進方法
本著能夠自動化就不要手動的理念,直接將上面的命令寫成一個shell,將三次執行變成shell的執行
restart_service.sh
#!/bin/bash# 要查找和終止的命令名稱
COMMAND_NAME="command_name"
# 查找包含指定命令的進程ID
# ---awk 'NR==1 {print $2}':只有一個進程,所以從第一行提取進程ID(第二列)即可
# ---grep -v grep 從搜索結果中排除包含 grep 命令本身的行
PID=$(ps -eLf | grep "$COMMAND_NAME" | grep -v grep | awk 'NR==1 {print $2}')
# 是否存在進程 (-z 測試字符串是否為空)
if [ -z "$PIDS" ]; thenecho "沒有查找到包含'${COMMAND_NAME}'的進程"
elseecho "殺死以下包含命令 '$COMMAND_NAME' 的進程:'$PIDS'"kill -9 $PID
fi#重啟服務
echo "重啟服務"
xxx service start
每次修改完畢之后,執行該shell即可。
$ ./restart_service.sh