在了解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_id
,child_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
ps ux | awk '{if($8=="Z+") print}'
结论
至此,你已经了解什么是僵尸进程,为什么要终止僵尸进程,如何查找僵尸进程以及终止僵尸进程。