僵尸进程以及如何处理僵尸进程

x33g5p2x  于2021-12-22 转载在 其他  
字(0.8k)|赞(0)|评价(0)|浏览(241)

僵尸进程:就是已经结束了的进程,但是没有从进程表中删除。太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。最后有defunct的标记,就表明是僵尸进程。

今天配置Redis的时候结束停止Redis服务的时候可能是误操作了,发生了上述的情况!

产生的原因:

每个Linux进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息 时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存 储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进程表 中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进 程终止后,但是父进程尚未读取这些数据之前。

Linux系统寻找和杀掉僵尸进程

Linux服务器上,多少会出现一些僵尸进程,下面介绍如何快速寻找和消灭这些僵尸进程的方法:
首先,可以使用top命令来查看服务器当前是否有僵尸进程,下图中可以看到僵尸进程的提示,如果数
字大于0,那么意味着服务器当前存在僵尸进程:

我们发现存在33个僵尸进程!

用ps 命令和 grep命令寻找僵尸进程:

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

命令注解:

  • A 参数列出所有进程
  • o自定义输出字段,我们设定显示字段为stat(状态),ppid(父进程pid),pid(进程pid),cmd(命令行)这四个参数

因为状态为 z 或者 Z的进程为僵尸进程,所以我们使用grep 抓取stat 状态为zZ进程;

运行结果如下所示:

我这里直接杀死僵尸进程的父进程

[root@songqixiang bin]# kill -9 31112

完事儿!

相关文章