用于杀死进程直到它死亡的 Bash 片段?

Ama*_*rus 9 scripting bash kill process snippet

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

我在想这样的事情

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done
Run Code Online (Sandbox Code Playgroud)

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

And*_*ett 11

反复终止进程的问题在于,您在创建新进程时遇到了竞争条件。这不是特别有可能,但是当您睡觉时,该进程可能会退出并且一个新进程以相同的 PID 启动。

为什么你必须反复终止进程?如果是因为进程会退出,但收到信号后可能需要一段时间退出,可以使用wait

 kill $PID
 wait $PID
Run Code Online (Sandbox Code Playgroud)

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

  • 如果 PID 不属于子进程,则此方法不起作用,即该脚本试图控制源自其他地方的进程的执行。当我尝试时,我得到“bash: wait: pid 32137 is not a child of this shell”。:( (2认同)

Adr*_*zza 9

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

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

它没有给进程一个干净的机会:

  1. 关闭套接字连接

  2. 清理临时文件

  3. 通知它的孩子它正在消失

  4. 重置其终端特性

等等等等等等。

通常,发送 15,然后等待一两秒钟,如果这不起作用,则发送 2,如果不起作用,则发送 1。如果没有,请删除二进制文件,因为该程序表现不佳!

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

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

我也同意在创建具有这里提到的相同 PID 的新进程时关心竞争条件。