Linux中的僵尸进程详解

856 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

什么是僵尸进程

“僵尸进程”也被称为“无效进程”,简单来说,僵尸进程是已失效但存在于系统进程表中的进程。我们都知道,在一般情况下,一个进程在执行完任务后会从进程表中移除,但是由于某种原因,有时候有些进程即使执行完了任务也依然留在进程表中,这些进程就是“僵尸进程”。

僵尸进程是如何产生的

当我们运行一个程序时,它会产生一个父进程以及很多子进程,来执行特定的任务,子进程完成任务后会发送一个Exit信号然后死亡,这个Exit信号需要被父进程读取,父进程需要随后调用 wait来检查子进程是否终止,如果子进程已经终止,那么这个子进程会从进程表中移除。

如果父进程正确的读取了子进程的exit信号,则子进程会从进程表中移除。

但是,如果父进程未能读取到子进程的exit信号,这个子进程完成任务处于死亡的状态,但也不会从进程表中移除。

僵尸进程是否对系统有害

由于僵尸进程并不做任何事情,不会使用任何资源也不会影响其它进程,因此存在僵尸进程也没什么坏处。

但是!如果存在太多僵尸进程的时候会出问题!

在进程终止的时候,系统会释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然会为其保留一定的信息(包括进程号、退出状态、运行时间等),直到父进程调用 wait后才释放。

如果父进程没有调用 wait的话,那么子进程保留的那些信息就不会被释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程,就出问题了!

试想一下:

你是一家公司的小老板,你每天根据公司员工的工作量来支付他们的工资,有一个员工他来公司之后不工作,哎,就在那摸鱼,不干任何工作,当然,你也不用付给他工资。

这个员工就可以理解成是僵尸进程,有一个两个的没什么问题,但是,如果你的公司有很多这种“僵尸员工”,你的公司就会变得非常拥挤,即使来了正常的员工也没办法工作。你说严重不严重。

如何找出僵尸进程

在终端输入下面命令:

ps aux | grep Z

就会列出进程表中所有僵尸进程的详细信息。

如何杀掉僵尸进程

正常情况下我们可以用 SIGKILL信号来杀死进程,也就是使用kill -9 pid命令,但是僵尸进程已经死了,不能杀死已经死掉的进程。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。

注意: 杀死父进程将影响其所有子进程,因此如果不是产生了大量的僵尸进程,最好在计划的系统维护中杀死父进程或重新启动系统。

原创不易,如果小伙伴们觉得有帮助,麻烦点个赞再走呗~

最后,感谢女朋友在工作和生活中的包容、理解与支持 !