如何在 Linux 上杀死僵尸进程
杀死僵尸!
也称为“defunct”(废弃)或“dead”(死亡)进程 - 简单来说,僵尸进程是指已经死亡但仍然存在于系统进程表中的进程。 理想情况下,它应该在完成其工作/执行后从进程表中清除,但由于某种原因,其父进程在执行后没有正确地清除它。
在一个公正的 (Linux) 世界中,进程在完成其执行并退出后会通知其父进程。 然后父进程将从进程表中删除该进程。 在此步骤中,如果父进程无法从其子进程(已完成的进程)读取进程状态,它将无法从内存中删除该进程,因此即使该进程已死亡,它仍然继续存在于进程表中 - 因此,被称为僵尸!
为了杀死僵尸进程,我们需要首先识别它。 可以使用以下命令来查找僵尸进程
$ ps aux | egrep "Z|defunct"
输出的 STAT 列中的 Z 和/或最后一列 (COMMAND) 中的 [defunct] 将标识一个僵尸进程。
实际上你不能杀死僵尸,因为它已经死了! 可以做的是显式通知其父进程,以便它可以重试读取子进程(已死亡)的状态,并最终从进程表中清除它们。 这可以通过向父进程发送 SIGCHLD 信号来完成。 可以使用以下命令来查找父进程 ID (PID)
$ ps -o ppid= <子进程 PID>
获得僵尸的父进程 ID 后,可以使用以下命令向父进程发送 SIGCHLD 信号
$ kill -s SIGCHLD <父进程 PID>
但是,如果这不能帮助清除僵尸进程,您将不得不杀死或重启其父进程,或者在僵尸进程大量涌现导致或即将导致系统崩溃的情况下,您将别无选择,只能进行系统重启。 可以使用以下命令来杀死其父进程
$ kill -9 <父进程 PID>
请注意,杀死父进程会影响其所有子进程,因此快速仔细检查会有助于确保安全。 另外,如果很少的僵尸进程没有消耗太多 CPU/内存,最好在下次计划的系统维护中杀死父进程或重启系统。