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

Zol*_* K. 0 bash kill background-process

sleep 1 & kill -9 $?
Run Code Online (Sandbox Code Playgroud)

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

这是为什么?


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

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

/bin/sleep 2 & pid=$?; sleep 1; kill -9 $pid
Run Code Online (Sandbox Code Playgroud)

GNU bash,版本 5.0.3(1)-release

Gil*_*il' 7

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

传递给killshell 命令的 PID被传递给底层系统调用。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 信号,该信号不可忽略。


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