僵尸进程,也称为“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>
如果向父进程发送SIGCHLD信号不能解决僵尸进程问题,则必须杀死或重新启动父进程。如果僵尸进程大量增加,导致系统停机,则可能需要重新启动系统。下面的命令可以用来终止父进程:
$ kill -9 <父PID>
请记住,杀死一个父进程将对它的所有子进程产生影响,因此在继续之前最好进行两次检查。如果一些孤立的僵尸进程没有使用大量的CPU或内存,那么最好等待并在下一次计划的维护期间杀死父进程或重新启动系统。
暂无评论