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
打印结果:
优化
我们还需要以下优化:
- 隐去错误日志;
- 把 if 改成 while 循环;
- 加上 1s 间隔,并打印
.
表示仍在运行
# 等待进程结束
wait_for_process_exit() {
local pidKilled=$1
while kill -0 $pidKilled > /dev/null 2>&1
do
echo -n "."
sleep 1;
done
}
- 加一个超时机制,避免死循环:
#/bin/bash
wait_for_process_exit() {
local pidKilled=$1
local begin=$(date +%s)
local end
while kill -0 $pidKilled > /dev/null 2>&1
do
echo -n "."
sleep 1;
end=$(date +%s)
if [ $((end-begin)) -gt 60 ];then
echo -e "\nTimeout"
break;
fi
done
}
wait_for_process_exit 83594