结束一个进程并等待该进程退出

41

当我从bash脚本启动我的tcp服务器时,我需要在当前实例开始监听之前终止先前的实例(可能仍然正在监听相同的端口)。

我可以使用类似于pkill <previous_pid>的命令。如果我理解正确,这只是向目标pid发送SIGTERM信号。当pkill返回时,目标进程可能仍然存在。是否有一种方法让pkill等待它退出?


2
你能在 [unix.se] 网站上提出同样的问题吗? - Braiam
这是我的解决方案,适用于服务:http://pastebin.com/VjpVNdz2。 - Antonio Petricca
1
为什么这个问题被认为是“离题”的?它是与Bash编程语言相关的编程问题。 - Audrius Meškauskas
1
很遗憾,到目前为止基本需求还没有得到解决。我猜可能有几千个脚本实现了这个简单的功能:杀死进程并等待直到其终止。如何改变当前的情况?如何达到目标? - guettli
3个回答

40

7
将其更改为 while $(kill -0 $PID 2>/dev/null); do,以忽略进程被杀死后出现的“没有这样的进程”消息。 - Gus
我尝试过这个,但它没有杀死进程,只是无限循环。我认为你需要在while循环内实际运行kill $PID - Lou
1
如果我没记错的话,kill -0并不会真正杀死进程,它只是检查进程是否仍在运行。 - Lou

2
使用wait(Bash内置命令)等待进程完成:
 pkill <previous_pid>
 wait <previous_pid>

17
等待命令说:“这不是当前终端的进程ID”,所以我必须执行 while ps -p $nPid; do sleep 1;done; 来等待该进程结束。 - Aquarius Power
14
wait 命令只适用于当前 shell 下的子进程,不能用于任意进程。目前没有通用的内置机制可以实现这一点。 - Daniel Andersson
为什么不使用 kill 呢? - nurettin

0
在我的情况下,使用进程的名称更容易。它的工作原理是这样的:
pkill <process_name> && while pgrep -l <process_name>; do sleep 1;done;

然后,重新启动该过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接