`
webdev2014
  • 浏览: 678045 次
文章分类
社区版块
存档分类
最新评论

Linux的僵尸进程及其解决方法

 
阅读更多
Linux的僵尸进程及其解决方法

  1. 产生原因:

  在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。

  但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。

  2. 原理分析:

  每个Unix进程在进程表里都有一个进入点(entry),核心进程执 行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个 进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。

  子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。那么会不会因为父进程太忙来不及 wait 子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?不会。因为UNIX提供了一种机制可以保证,只要父进程想知道子进程结束时的状态信息,就可以得到。这种机制就是:当子进程走完了自己的生命周期后,它会执行exit()系统调用,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运行时间the amount of CPU time taken by the process等),这些数据会一直保留到系统将它传递给它的父进程为止,直到父进程通过wait / waitpid来取时才释放。

  3.解决方法:

  (1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。

  执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

  (2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。

  (3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号

  (4)fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。

-------------------------------------------------------------------------------------------------------------------------------------------

最近工作过程中,发现好几台服务器出现僵死进程(如图)。

点击查看原图

  用下面的命令找出僵死进程

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

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

     -C 用来指定所执行的命令名称,你这里也就是让ps仅仅显示php命令所产生的进程的信息
    ps -C java -o lstart,pid,cmd【不过貌似打印的不全~】
       ps -A -o lstart,pid,args |grep java【这个可以的~】

  因为状态为 z或者Z 的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
  运行结果参考如下

点击查看原图

  这里一共出现了9个僵死进程,我们需要把它们都干掉,执行下面的命令

  kill -9 8310

  这时你再执行查找僵死的进程,发现所有僵死进程都没了.

  补充:

  最近又遇到了个问题,一台服务器上产生了100多少僵死进程,而且每一僵死进程的父进程都不一样,如果用上面的方法,一条一条的杀,那还不得累死我啊。
  那么就应该想一条简单的命令,直接查找僵死进程,然后将父进程杀死~

  ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

综合多个csdn

分享到:
评论

相关推荐

    Linux 僵尸进程产生原因及解决方法

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,...

    在Linux系统中查看进程及杀死僵尸进程的方法.docx

    在Linux系统中查看进程及杀死僵尸进程的方法.docx

    lovely_touching:一个简单的用于docker容器的初始化系统,可以避免未收割的僵尸并确保进程完全关闭。 写在Rust。 您可能应该改用嗅觉男爵,它是用C语言编写的,并且具有一些更有用的功能

    哦,不, -TLDR:您的进程可能会以不好的方式关闭,而僵尸进程将吞噬您的容器! 相反,只需使用lovely_touching : 下载它(此二进制文件可以在Centos / Redhat 5及更高版本的任何Linux版本上运行): wget ...

    redhat linux教材20课程学习文档

    2.5.2 僵尸进程 2.5.3 进程和多任务的实现 2.6 Linux设备与网络 2.7 Shell控制台 第二部分 基础知识 第三章 Shell命令使用 3.1 控制台相关命令 clear 命令 echo 命令 yes 命令 3.2 目录操作命令 cd 命令 pwd ...

    尚观史上Linux嵌入式开发系统课程

    ├day18-01 fork与sighal的组合(避免僵尸进程).mp4 ├day18-02 匿名管道之创建、缓冲区大小、阻塞模式.mp4 ├day18-03 知识点总结.mp4 ├day19_匿名管道子父进程通信、有名管道创建、删除.mp4 ├day20_有名管道的...

    毕业设计论文范文源码-InterviewFAQ-Linux:总结操作系统及Linux的面试常见问题

    Task:僵尸进程的数量 CPU:%wa IOwait Mem: Swap:要尽可能的少用 uptime free:读取自文件:/proc/meminfo buffer存放要写回到磁盘的数据 cache存放从磁盘上读出的数据 -buffers/cache,表示一个应

    基于TCP的聊天系统

    僵尸进程一定要求处理 4.服务器尽量写成守护进程 5.应用链表保存在线用户信息 6.将所有用户信息保存到sqlite数据库中 7.能够导出相关数据到文本文档中(如聊天记录。。) 二.分工与描述 功能:1.(数据库及其...

    db2-技术经验总结

    1.70. 查看DB2是否存在僵尸进程 98 1.71. 监控执行成本最高的SQL语句 99 1.72. 监控运行最长的SQL语句 99 1.73. 给表增加generated always时需要注意(原) 99 1.74. 给表增加索引的时候,可以增加collect detailed ...

    JAVA上百实例源码以及开源项目源代码

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象...

    java开源包1

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包11

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包2

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包3

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包6

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包5

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包10

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包4

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包8

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包7

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

Global site tag (gtag.js) - Google Analytics