Bash 代码片段用于终止一个进程直到它死亡吗?

Bash 代码片段用于终止一个进程直到它死亡吗?

我正在尝试编写一个强大的 bash 脚本,并在其中创建一个后台进程。在脚本的末尾,我想终止它。我有它的 PID。

我在想这样的事情

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

有什么更好的建议吗?这种方法可能存在什么问题吗?

答案1

反复终止进程的问题在于,新进程的创建会产生竞争条件。这种情况不太可能发生,但有可能在您休眠时,进程会退出,而新进程会以相同的 PID 启动。

为什么要反复终止该进程?如果是因为进程将退出,但在收到信号后可能需要一些时间才能退出,则可以使用wait

 kill $PID
 wait $PID

在理想的系统中,您永远不必重复kill或问题kill -9 $PID。如果确实需要,您可能需要考虑修复您正在运行的任何内容,这样您就不必这样做了。与此同时,您可能不会遇到竞争条件,您可以通过(比如说)在终止进程之前检查 /proc/$PID/ 的时间戳来防止这种情况。不过,这是糟糕的黑客行为。

答案2

kill $PID对于推荐从到的步骤的每个人kill -9 $PID,我必须提醒你kill -9 无用

不不不。不要使用 kill -9。

它没有给这个过程一个机会来清理:

  1. 关闭套接字连接

  2. 清理临时文件

  3. 通知其子进程它要离开了

  4. 重置其终端特性

等等等等。

一般来说,发送 15,然后等待一两秒,如果不行,就发送 2,如果还不行,就发送 1。如果还不行,就删除该二进制文件,因为程序行为很糟糕!

不要使用kill -9。不要为了整理花盆而开出联合收割机。

现在,我不同意“删除二进制部分”,但进展似乎比仅仅删除二进制部分损害更小kill -9

我也同意对使用相同 PID 创建新进程时竞争条件的关注这里

答案3

首先进行常规杀戮,睡眠 x 秒,然后如果它还在,则将其杀死 -9。此外,这确实看起来像是你遇到的一个奇怪情况,可能需要向我们解释更大的问题。

答案4

为什么不只是

kill -9 $PID

相关内容