Kill -9 后台作业也会杀死 bash

Kill -9 后台作业也会杀死 bash
sleep 1 & kill -9 $?

以上将杀死(最有可能)巴什shell 或当前终端窗口。

这是为什么?


注意:sleep 1 & kill $?不会杀死 shell/终端。

只是为了确保我不会运行与我的想法不同的东西,有一些竞争条件等,以下也会产生相同的效果:

/bin/sleep 2 & pid=$?; sleep 1; kill -9 $pid

GNU bash,版本 5.0.3(1)-发布

答案1

$?是最后一个命令的退出状态。启动后台命令总是会成功,因此在 中… & do_something_with $?, 的值为$?0。您正在运行kill -9 0

PID 传递给kill会向下传递给底层系统调用。 Shell 手册没有记录它可以是 PID 以外的东西,但是系统调用手册确实如此。如果PID为0,则表示当前进程中的所有进程进程组。 (-1 表示除 PID 1 之外的每个进程,另一个负值表示指定进程组中的每个进程。)在终端中运行的 shell 位于其自己的进程组中(除非您经过大量的循环或存在子 shell不在后台作业中),所以kill -9 0相当于kill -9 $$:它杀死了 shell 进程。

任何后台进程(例如sleep命令)都会继续运行。它没有收到信号,外壳甚至没有机会发送信号。终端的死亡通常也不会影响它,尽管有些程序如果尝试写入关闭的终端可能会出错(当然这是sleep不行的)。

kill 0发送 TERM 信号,shell 会忽略该信号。kill -9 0发送KILL信号,该信号不能被忽略。


如果您想终止最近的后台进程,那就是$!.

相关内容