![为什么在 Mac 上 kill -9 0 只会杀死 bash shell?](https://linux22.com/image/1454487/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%20Mac%20%E4%B8%8A%20kill%20-9%200%20%E5%8F%AA%E4%BC%9A%E6%9D%80%E6%AD%BB%20bash%20shell%EF%BC%9F.png)
我想看看当我尝试终止进程时会发生什么kernel_task
。由于kill -9 pid
是强制退出进程的命令,并且kernel_task
的 pid 为 0,所以我只需运行kill -9 0
。
在终止 root 进程时,你不会得到Permission Denied
或,而是只会得到以下内容:Operation not permitted
Last login: Thu Jun 18 16:55:10 on ttys005
MacBook-Air:~ james$ kill -9 0
[Process completed]
...这很奇怪,因为尝试杀死launchd
(低一个级别kernel_task
)会给你带来以下结果:
-bash: kill: (1) - Operation not permitted
以及所有其他根进程。
它为什么只是终止调用该命令的进程,而不是Operation not permitted
像所有其他根进程一样发送?
如果您能告诉我这个问题的答案,我将获得加分:如果您创建一个试图终止kernel_task
(并忽略SIGTERM
)的脚本,则运行它将输出Killed: 9
并返回到 bash。为什么它在终止时将其放入 stdout?为什么不提供更具描述性的内容?
答案1
并且
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).
换句话说,就您而言,kill -9 0
这只是一种向自身发送(致命)信号的奇特方式。(有关进程组的更多信息。)
为什么它只是终止调用命令的进程
(除非您调整了 shell 设置)是内置的 shell命令kill
。换句话说,shell 调用 syscall kill
,这会导致其自我终止。
尝试使用外部kill
命令,例如/bin/kill -9 0
。在这种情况下,只有/bin/kill
会被杀死。