在了解Zombie进程之前,让我回忆一下什么是进程。简而言之,进程是程序实例。它可以是前台的交互式进程或后台的非交互式或自动进程。

它可以是父进程,运行时其他进程的创建者。也可以是子进程是由其它进程创建的进程。

在Linux除了第一个PID为0的init/systemd初始化进程外,其他每个进程都有一个父进程。

使用pstree命令在终端中的查看进程树时,也可以查看系统进程的族普。在本教程中将说明如何在Linux终止僵尸进程。

僵尸进程

当子进程死亡时,会通知父进程,以便它可以进行一些清理,例如释放内存等。

但是存在另一种例外情况是,当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源。此时子进程将成为一个僵尸进程。

僵尸进程危害

实话说僵尸进程并不像它的名字听起来那么危险。如果您的系统内存有限或者有太多僵尸进程占用内存,则可能会出现问题。

此外,现在的Linux发行版都可以将进程PID的最大值设置为32768。如果系统进程没有可用的ID,您的系统可能会崩溃。

这种情况很少发生,但有可能发生,如果一个编码不当的程序开始产生大量僵尸进程。在这种情况下,最好找到并终止僵尸进程。

查找僵尸进程

Linux中的进程可以是这些状态之一,D不间断睡眠,I空闲,R正在运行,S睡眠,T由进程制信号终止,t在跟踪状态,通常是被调试器停止。Z僵尸进程。

在查找僵尸进程不妨是先要确认Linux系统存在多少的僵尸进程运行top命令,top命令输出的第二行行尾包行僵尸进程的计数1 zombie

现在Linux系统仅仅存在一个僵尸进程,因此,我们可以不用终止它。但是当系统存在大量的僵尸进程的你可能就需要终止他们。

要找到Linux系统存在僵尸进程,最简单方法使用ps命令列出所有进程,然后通过管道传递awk命令根据进程状态过滤僵尸进程。

top
ps ux | awk '{if($8=="Z+") print}'
top - 22:34:07 up 12:11,  1 user,  load average: 1.82, 1.83, 1.64
Tasks: 393 total,   1 running, 391 sleeping,   0 stopped,   1 zombie

终止僵尸进程

僵尸进程已经死了,你如何杀死一个已经死了的进程。在僵尸电影中,你可以射击僵尸的头部或放火烧它。

但在这里不是一个很好选项。你可以烧毁你的系统来杀死僵尸进程,但这不是一个很好的解决方案。

有些人建议向父进程发送SIGCHLD信号。但它更有可能被忽视。杀死僵尸进程的另一个选择是杀死其父进程。

这听起来很残酷,但这是杀死僵尸进程的唯一可靠方法。在终止僵尸进程之前。让我们列出僵尸进程PID。这一点可以在终端运行ps命令来实现。

ps ux命令输出的第8列是进程的状态。这里通过awk命令仅打印进程状态为Z+的进程,Z+表示僵尸进程。

确定僵尸进程PID后,让我们获取其父进程PID,运行命令ps -o ppid= -p child_process_idchild_process_id是僵尸进程PID。

你也可以运行两个命令的组合命令ps -A -ostat,pid,ppid | grep -e '[zZ]',命令将直接提供僵尸进程的PID及其父进程的PID。

ps ux | awk '{if($8=="Z+") print}'
ps -o ppid= -p child_process_id_number

ps -A -ostat,pid,ppid | grep -e '[zZ]'
Z+      1828    1754

Z+是子进程的状态,1828是子进程PID,1754是父进程PID。

现在您获得了父进程PID,最后运行命令sudo kill -9 parent_process_ID终止进程parent_process_ID是父进程PID。

当终止父进程后可以再次运行命令ps ux | awk '{if($8=="Z+") print}',确认是否终止僵尸进程,也可以运行top命令查看僵尸进程的计数。

kill -9 <parent_process_ID>
ps ux | awk '{if($8=="Z+") print}'

结论

至此,你已经了解什么是僵尸进程,为什么要终止僵尸进程,如何查找僵尸进程以及终止僵尸进程。