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
}
  1. 加一个超时机制,避免死循环:
#/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
posted @ 2022-12-02 14:41  极客子羽  阅读(1781)  评论(0编辑  收藏  举报