在 Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。

“僵尸”进程是一个早已 死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。

由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数 目太多,还会导致系统瘫痪。

我们知道,每个Unix进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。

当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。

当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。

这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进 程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。

由此可见,defunct进程的出现时间是在子进 程终止后,但是父进程尚未读取这些数据之前。

defunct进程是不能直接kill -9杀掉的,否则就不叫僵尸进程了。

知道了defunct进程产生的原因,就可以轻易的kill掉defunct进程。

杀僵尸进程的方法:

1,重启服务器电脑,这个是最简单,最易用的方法,但是如果你服务器电脑上运行有其他的程序,那么这个方法,代价很大。
  所以,尽量使用下面一种方法。

2,找到该defunct僵尸进程的父进程,将该进程的父进程杀掉,则此defunct进程将自动消失。

杀僵尸进程父进程如下:

ps -ef | grep defunct | awk '{print $3}' | xargs -i kill {}

在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程。

僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。
    defunct进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的process个数的限制已经快超过了,zombie进程不会有更多的坏处。

产生原因:
1.在子进程终止后到父进程调用wait()前的时间里,子进程被称为zombie。
2.网络原因有时会引起僵死进程。

正确方法:
方法1.设置 SIGCHLD 信号为SIG_IGN,系统将不产生僵死进程。

在 fork前后加入以下代码:

signal(SIGCHLD, SIG_IGN);

方法2.用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。

僵尸进程产生的原因:
    一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。

在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,

除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,

如果他的父进程没安装SIGCHLD信号处理函数,调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,

那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。

但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

linux 僵尸进程 defunct相关推荐

  1. linux僵尸进程defunct

    defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪. 使用kill -9 [进程ID]发现无法杀死僵尸进程. 解决方案:应该首先查看其父进程,然后再杀死该父 ...

  2. linux defunct 进程,Linux僵尸进程(Zombie or defunct)

    僵尸进程(Zombie or defunct)关于Linux僵尸进程,一般是由于子进程结束的时候,会有一些资源没有释放掉,直到父进程结束或者由父进程去处理它才可以! www.cit.cn 僵尸进程就是 ...

  3. 转:Linux 僵尸进程详解

    Linux 僵尸进程详解 转载:http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225 1.僵尸进程概念: 僵尸进程(Z ...

  4. linux下僵尸进程(Defunct进程)的产生与避免

    在测试基于 DirectFB+Gstreamer 的视频联播系统的一个 Demo 的时候,其中大量使用 system 调用的语句,例如在 menu 代码中的 system("./play&q ...

  5. linux僵尸进程产生的原因以及如何避免产生僵尸进程defunct

    给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...

  6. 【linux】僵尸进程(Defunct进程)的产生与避免

    一.什么是僵尸进程 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状态时,看到这些进程的状态栏为 ...

  7. linux 僵尸进程deffunc,subprocess.Popen引起的僵尸进程[sh] defunct

    今天用python写一个监控日志的demo遇到一个很奇怪的现象.demo的功能是:用tail -f监控日志文件的新内容,直到匹配到标识符字符串为止,若在一定时间内没有监听到标识符字符串,则脚本结束,打 ...

  8. linux僵尸进程理解,聊聊Linux系统中的僵尸进程

    车祸现场 今天下午,笔者正在认真搬砖,日志集群中有一台机器忽然报init进程占用100% CPU.strace之,发现疯狂输出如下系统调用. ~ strace -p 1 rt_sigprocmask( ...

  9. Linux僵尸进程堆栈分析,linux系统僵尸进程

    1 什么是僵尸进程: 当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程.如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的 ...

最新文章

  1. JS的prototype和__proto__
  2. 求两个有序数组的中位数或者第k小元素
  3. 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题
  4. 最小树 次小树 模板
  5. python3连接mysql数据库_python3.4连接mysql数据库
  6. 原生与html,解析原生与html之间进行的一些关联
  7. WebBrowser(IE) 与 JS 相互调用
  8. SELinux让php程序无法远程连接数据库
  9. new fabu
  10. dpdk 18 ixgbe驱动初始化分析
  11. 17-Flutter移动电商实战-首页_楼层区域的编写
  12. python内置数学函数库_在没有任何内置的求值函数或外部库的情况下用python解决数学问题...
  13. mysql.servet复制到哪_Mysql复制及代理
  14. php网站模板包括增删改查,PHP实现简单的增删改查
  15. Atitit 动态调用webservice与客户端代理方式调用
  16. 将路由器当成交换机使用
  17. 5分+细胞器基因组好文!多线南蜥线粒体基因组及比较基因组研究
  18. js仿百度文库文档上传页面的分类选择器_第二版
  19. 技术干货 | Linkis实践:新引擎实现流程解析
  20. VisualNet地税管网综合资源管理系统

热门文章

  1. stm32对flash的读写保护与解除
  2. Internet Explorer 已停止工作 解决办法
  3. redis-5.0.4集群部署
  4. web项目性能优化--网络、js、渲染
  5. Java面向对象之继承,方法重写,super关键字,员工类系列继承题
  6. box-sizing 属性
  7. MySQL添加用户、删除用户与授权
  8. openshift django目录结果
  9. android之权限大全
  10. 5G-NR复用与信道编码