shell查詢程序殺死程序並等待程序退出
阿新 • • 發佈:2022-12-02
查詢並殺死程序
stop_service() {
# 查詢Java程序ID
local pid=$(ps -ef | grep java | grep "${process_keyword}" | grep -v grep | awk '{print $2}')
# 如果程序ID不為空
if [[ -n $pid ]]; then
echo "Try to kill $pid"
# 殺死程序並等待程序退出
kill $pid && wait_for_process_exit "$pid"
fi
}
等待程序退出
利用 kill -0 檢查程序是否存在
shell 命令 “kill -0” 的作用
使用 kill -0 pid
檢查一個程序是否存在
- 若存在,即程序在執行,執行
echo $?
會返回 0。 - 若不存在,即程序已停止執行,執行
echo $?
會返回 1。
首先,用以下指令碼說明上述結論:
#/bin/bash
kill -0 83594
echo $?
kill -0 183594
echo $?
其中,程序 83594 是存在的,但是 183594 是不存在的。
列印結果:
但是,要理解這個返回結果,還是得知道 kill -0 pid
不傳送任何訊號,但是系統會進行錯誤檢查。
- 0 表示正常,沒有錯誤,那程序還正常執行,那肯定還存在呀;
- 1 表示錯誤,確實丟擲了 No such process 錯誤,程序也不在了;
- 另外,Linux 的返回碼規則是除 0 以外全是錯誤;
使用 if kill -0 pid; 判斷
因此,我們可以搭配上 if 進行判斷了:
#/bin/bash
if kill -0 83594; then
echo "83594 alive"
fi
if kill -0 183594; then
echo "183594 alive"
fi
列印結果:
最終效果
我們還需要以下優化:
- 隱去錯誤日誌;
- 把 if 改成 while 迴圈;
- 加上 1s 間隔,並列印
.
表示仍在執行
# 等待程序結束 wait_for_process_exit() { local pidKilled=$1 while kill -0 $pidKilled > /dev/null 2>&1 do echo -n "." sleep 1; done }