1. 程式人生 > 其它 >shell查詢程序殺死程序並等待程序退出

shell查詢程序殺死程序並等待程序退出

查詢並殺死程序

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

列印結果:

最終效果

我們還需要以下優化:

  1. 隱去錯誤日誌;
  2. 把 if 改成 while 迴圈;
  3. 加上 1s 間隔,並列印.表示仍在執行
# 等待程序結束
wait_for_process_exit() {
	local pidKilled=$1
	while kill -0 $pidKilled > /dev/null 2>&1
	do
		echo -n "."
		sleep 1;
	done
}