Macos 如何杀死父进程为PID=0的僵尸进程?

Macos 如何杀死父进程为PID=0的僵尸进程?,macos,zombie-process,Macos,Zombie Process,通常,在OSX上运行LLDB时,调试器会偶尔崩溃(这似乎就是LLDB的本质)。当这种情况发生时,我得到一个看起来非常奇怪的僵尸进程(我正在调试的那个)。它的父PID=0: 我的过程叫做:worker 这是ps aux|grep worker的输出 root 22785 0.0 0.0 0 0 ?? Z 3:48pm 0:00.00 (worker) 如您所见,流程有一个PID,但没有父PID。这没用 sudo kill -9

通常,在OSX上运行LLDB时,调试器会偶尔崩溃(这似乎就是LLDB的本质)。当这种情况发生时,我得到一个看起来非常奇怪的僵尸进程(我正在调试的那个)。它的父PID=0:

我的过程叫做:worker

这是
ps aux|grep worker的输出

root            22785   0.0  0.0        0      0   ??  Z     3:48pm   0:00.00 (worker)
如您所见,流程有一个PID,但没有父PID。这没用

sudo kill -9 <pid>
sudo kill-9
事实上,只有重启才能摆脱它。我怎样才能终止这样的进程?我需要进程死亡,因为它保留着我需要的端口。

僵尸是已经死亡的进程的名称。因此,它们不再运行,也不再消耗系统资源。它们仅列在进程表中,在僵尸进程完成运行时无法正确更新。这也是它们没有分配给任何有意义的父项的原因。

因此,你不能第二次杀死一个僵尸(正如他们的名字已经暗示的那样,与中级恐怖电影中发生的事情相反:-)。在大多数操作系统中,等待一段时间僵尸进程从进程列表中消失就足够了。或者,如果您无法接受此操作,则必须重新启动。


请放心,僵尸不会对您造成伤害。

情况是,作为用户,不可能清理僵尸进程;如果可能的话,内核将在准备就绪时处理它

如中所述

这是一种完全正常的状态,每一个过程通常花费的时间都是微乎其微的,就在它能够平静地休息之前……那些活了很久的父母,却抛弃了他们的孩子,转而从事其他事情,他们会诅咒孩子们陷入僵尸般的准死亡状态。无论出于何种目的,僵尸都已经死了


由于调试器充当其目标进程的父进程,该进程拥有一个网络端口,并且调试器已崩溃,因此它使目标进程处于僵死状态。这里的问题是调试器崩溃。

需要做的是连接到正在运行的父级。Init应该为您清理这些进程

我们可以通过以下方式创建一个已失效的流程:

bash$ (sleep 1 & exec /bin/sleep 5000) &
现在,我们可以检查已失效的流程:

$ ps -C sleep
PID TTY          TIME CMD
22582 pts/3    00:00:00 sleep
22583 pts/3    00:00:00 sleep <defunct>
我们可以看到,已失效的进程被另一个
ps-C sleep
清理:

 PID TTY          TIME CMD
22582 pts/3    00:00:00 sleep
我希望这有帮助


编辑:僵尸不会占用资源。但是,它们确实会占用内核进程表中的一个插槽,如果没有更多的空间,那么可能无法启动另一个进程。

为什么用斜体或
code
过度格式化“僵尸”?这是一个普通的词。@cybermonkey可以提高可读性吗?我不知道为其他目标使用代码格式在任何情况下都是有害的。。。但为了取悦您,我更改了格式:-)它实际上损害了可读性,而不是积极地改进它。我自己也做过一次,而且是。僵尸会伤害我。这个僵尸在我的机器上持有一个打开的端口,它阻止我启动进程的另一个副本。所以,不,这不仅仅是一个“即将死亡”的过程——它是非常有活力的kicking@Thomas凯瑟这不是踢你的僵尸。这是一个内核TCP网络连接表。正确关闭的TCP网络连接将从中消失。如果一方死亡,这种连接就无法获得RST,RST将结束它。TCP/IP标准没有规定清除这些连接需要等待多长时间(理论上:永远——内核不知道为什么没有任何一方发送数据;不通过开放连接发送数据是完全可以的)。大多数TCP/IP堆栈实现在24小时内清除此类连接。好的,那么没有办法强制内核立即清理吗?这就是糟糕的操作系统设计
 PID TTY          TIME CMD
22582 pts/3    00:00:00 sleep