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
$?
是最后一个命令的退出状态。启动后台命令总是会成功,因此在 中… & do_something_with $?
, 的值为$?
0。您正在运行kill -9 0
。
传递给kill
shell 命令的 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 信号,该信号不可忽略。
如果您打算终止最近的后台进程,那就是$!
.