什么是僵尸进程和Linux中的僵尸进程

时间:2020-03-05 15:28:21  来源:igfitidea点击:

在Linux操作系统中,僵尸进程或者废弃过程是一个完成的(死亡)的过程,但它仍然占据了过程表中的条目。
通常,已完成其执行的子进程将向已创建它的父进程发送Sigchld信号。
然后父进程将发送一个等待系统调用,可以通过它读取子的退出状态。
收到等待系统调用后,将从进程表中删除子项。
在某些情况下,父父可以忽略SigChld信号,该信号导致完成过程仍然存在于过程表中,该过程表成为僵尸过程。

有时,这对于父进程是可取的,以确保它不会将与另一个子的另一个PID分配。

当一个过程变得死亡时,它将释放分配给它的内存和其他资源。
因此,除了过程表中的条目之外,僵尸进程根本不会使用任何资源。
仅当存在大量僵尸进程并且系统运行超出PID时,问题可能仅启动。
在本教程中,我们将看到如何检测和终止如何检测僵尸进程。

如果系统生成大量僵尸进程,那么它应该是需要检查可用修补程序以纠正问题的应用程序错误。

检测僵尸进程

我们可以使用Linux PS命令找到僵尸进程。

此命令将列出"统计"列的所有进程。
如果进程是僵尸进程,则STAT列将具有字符"Z"。
使用以下任何命令,我们可以找到僵尸进程。

ps aux | awk '{ print  " "  }' | grep -w Z
ps –el | grep Z

处理僵尸进程

随着僵尸进程不会消耗任何资源,如果服务器运行顺利,则可以忽略它。
但在服务器面临重载的情况下,大量的僵尸进程可能成为一个问题。
因此,为了摆脱僵尸进程,我们可以考虑以下任何方法。

1)将Sigchld信号发送到僵尸的父过程

在接收到Sigchld命令后,父进程必须发送一个删除僵尸进程的等待系统调用。
这可以通过执行以下命令来完成。

kill -s SIGCHLD

PPID是父进程的PID,它调用Zombie子流程。
我们可以执行以下命令以查找僵尸进程的PPID。

ps aux -eo ppid | grep

如果父进程明确忽略SigChld信号,则应考虑终止父进程(步骤2)。

2)杀死父进程

如果僵尸进程无法删除,则应杀死父进程或者重新启动服务以摆脱僵尸。
当父级被杀死时,所有子进程将成为"init进程(PID 1)"的子进程。
init过程将等待儿童通过发送等待信号而死,这反过来倒掉僵尸进程。
可以使用"kill"命令终止父进程:

kill -9