为什么在 Mac 上 kill -9 0 只是杀死 bash shell?

noɥ*_*ɐɹƆ 5 macos

我想看看当我试图终止kernel_task进程时会发生什么。由于kill -9 pid是强制退出进程的命令,并且kernel_taskpid 为 0,因此我只是运行了kill -9 0.

而不是在杀死根进程时获取Permission Denied或 a Operation not permitted,您只需获取以下信息:

Last login: Thu Jun 18 16:55:10 on ttys005
MacBook-Air:~ james$ kill -9 0

[Process completed]
Run Code Online (Sandbox Code Playgroud)

...这很奇怪,因为试图杀死launchd(低于一级kernel_task)会给你这个:

-bash: kill: (1) - Operation not permitted
Run Code Online (Sandbox Code Playgroud)

和所有其他根进程。

为什么它只是终止调用命令的进程,而不是Operation not permitted像所有其他根进程那样发送?

如果您能告诉我这个问题的答案,则可以加分:如果您创建了一个试图杀死kernel_task(并忽略SIGTERM)的脚本,则运行它会输出Killed: 9并返回到 bash。为什么它在杀死它时将其放入标准输出?为什么不做一些更具描述性的事情?

小智 4

并且kernel_task的 pid 是 0

他们可能使用 PID 0,因为它是保留的 PID,因此您无法向进程发送信号。

我干脆就跑了kill -9 0。

*nix 命令或多或少是系统调用kill的直接前端。从系统调用的文档来看:kill

If pid is zero:
      Sig is sent to all processes whose group ID is equal to the process group ID of the sender, and
      for which the process has permission; this is a variant of killpg(2).
Run Code Online (Sandbox Code Playgroud)

换句话说,在您的情况下,kill -9 0这只是一种向自身发送(致命)信号的奇特方式。(有关进程组的更多信息。)

为什么它只是终止调用该命令的进程

(kill除非您调整了 shell 设置)是内置 shell 命令。换句话说,shell 调用kill系统调用并导致它自杀。

尝试相同的操作,但使用外部kill命令,例如/bin/kill -9 0。在这种情况下,只有他们/bin/kill会被杀死。