僵尸进程:就是已经结束了的进程,但是没有从进程表中删除。太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。最后有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
完事儿!