当我从bash脚本启动我的tcp服务器时,我需要在当前实例开始监听之前终止先前的实例(可能仍然正在监听相同的端口)。
我可以使用类似于pkill <previous_pid>
的命令。如果我理解正确,这只是向目标pid发送SIGTERM
信号。当pkill
返回时,目标进程可能仍然存在。是否有一种方法让pkill
等待它退出?
当我从bash脚本启动我的tcp服务器时,我需要在当前实例开始监听之前终止先前的实例(可能仍然正在监听相同的端口)。
我可以使用类似于pkill <previous_pid>
的命令。如果我理解正确,这只是向目标pid发送SIGTERM
信号。当pkill
返回时,目标进程可能仍然存在。是否有一种方法让pkill
等待它退出?
不,你所能做的是使用kill -0 $PID
编写一个循环。如果此调用失败($? -ne 0
),则进程已终止(在你正常地使用kill
之后):
while kill -0 $PID; do
sleep 1
done
(感谢qbolec提供的代码)
相关:
while $(kill -0 $PID 2>/dev/null); do
,以忽略进程被杀死后出现的“没有这样的进程”消息。 - Guskill $PID
。 - Loukill -0
并不会真正杀死进程,它只是检查进程是否仍在运行。 - Louwait
(Bash内置命令)等待进程完成: pkill <previous_pid>
wait <previous_pid>
while ps -p $nPid; do sleep 1;done;
来等待该进程结束。 - Aquarius Powerwait
命令只适用于当前 shell 下的子进程,不能用于任意进程。目前没有通用的内置机制可以实现这一点。 - Daniel Anderssonkill
呢? - nurettinpkill <process_name> && while pgrep -l <process_name>; do sleep 1;done;