linux 僵尸进程 defunct
在 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相关推荐
- linux僵尸进程defunct
defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪. 使用kill -9 [进程ID]发现无法杀死僵尸进程. 解决方案:应该首先查看其父进程,然后再杀死该父 ...
- linux defunct 进程,Linux僵尸进程(Zombie or defunct)
僵尸进程(Zombie or defunct)关于Linux僵尸进程,一般是由于子进程结束的时候,会有一些资源没有释放掉,直到父进程结束或者由父进程去处理它才可以! www.cit.cn 僵尸进程就是 ...
- 转:Linux 僵尸进程详解
Linux 僵尸进程详解 转载:http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225 1.僵尸进程概念: 僵尸进程(Z ...
- linux下僵尸进程(Defunct进程)的产生与避免
在测试基于 DirectFB+Gstreamer 的视频联播系统的一个 Demo 的时候,其中大量使用 system 调用的语句,例如在 menu 代码中的 system("./play&q ...
- linux僵尸进程产生的原因以及如何避免产生僵尸进程defunct
给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...
- 【linux】僵尸进程(Defunct进程)的产生与避免
一.什么是僵尸进程 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状态时,看到这些进程的状态栏为 ...
- linux 僵尸进程deffunc,subprocess.Popen引起的僵尸进程[sh] defunct
今天用python写一个监控日志的demo遇到一个很奇怪的现象.demo的功能是:用tail -f监控日志文件的新内容,直到匹配到标识符字符串为止,若在一定时间内没有监听到标识符字符串,则脚本结束,打 ...
- linux僵尸进程理解,聊聊Linux系统中的僵尸进程
车祸现场 今天下午,笔者正在认真搬砖,日志集群中有一台机器忽然报init进程占用100% CPU.strace之,发现疯狂输出如下系统调用. ~ strace -p 1 rt_sigprocmask( ...
- Linux僵尸进程堆栈分析,linux系统僵尸进程
1 什么是僵尸进程: 当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程.如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的 ...
最新文章
- JS的prototype和__proto__
- 求两个有序数组的中位数或者第k小元素
- 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题
- 最小树 次小树 模板
- python3连接mysql数据库_python3.4连接mysql数据库
- 原生与html,解析原生与html之间进行的一些关联
- WebBrowser(IE) 与 JS 相互调用
- SELinux让php程序无法远程连接数据库
- new fabu
- dpdk 18 ixgbe驱动初始化分析
- 17-Flutter移动电商实战-首页_楼层区域的编写
- python内置数学函数库_在没有任何内置的求值函数或外部库的情况下用python解决数学问题...
- mysql.servet复制到哪_Mysql复制及代理
- php网站模板包括增删改查,PHP实现简单的增删改查
- Atitit 动态调用webservice与客户端代理方式调用
- 将路由器当成交换机使用
- 5分+细胞器基因组好文!多线南蜥线粒体基因组及比较基因组研究
- js仿百度文库文档上传页面的分类选择器_第二版
- 技术干货 | Linkis实践:新引擎实现流程解析
- VisualNet地税管网综合资源管理系统