




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux僵尸进程详细解析在fork(/execve(过程中,假设子进程结束时父进程仍存在,而父进程fork(之前既没安装SIGCHLD信号处理函数调用waitpid(等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在,僵尸进程成为孤儿进程,过继给1号进程init,init始终会负责清理僵尸进程。僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie进程怎样产生僵尸进程的:一个进程在调用exit命令结束自己的生命的时候,其
2、实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid(等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那
3、么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。怎么查看僵尸进程:利用命令ps,可以看到有标记为Z的进程就是僵尸进程。怎样来清除僵尸进程:1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid(函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。2.
4、把父进程杀掉。父进程死后,僵尸进程成为孤儿进程,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。=在Linux中可以用ps auwx发现僵尸进程a all w/ tty, including other users 所有窗口和终端,包括其他用户的进程u user-oriented 面向用户(用户友好-w,w wide output 宽格式输出x processes w/o controlling ttys在僵尸进程后面会标注ps axf看进程树,以树形方式现实进程列表ps axm会把线程列出来,在linux下进程和线程是统一的,是轻量级进程的两种方式。p
5、s axu显示进程的详细状态=killallkill -15kill -9一般都不能杀掉defunct进程用了kill -15,kill -9以后之后反而会多出更多的僵尸进程kill -kill pidfuser -k pid可以考虑杀死他的parent process,kill -9 他的parent process= 一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源的进程被称为僵死进程(Zombie Process。避免zombie的方法:1在SVR4中,如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。另
6、外,使用SVR4版的sigaction,则可设置SA_NOCLDW AIT标志以避免子进程僵死。Linux中也可使用这个,在一个程序的开始调用这个函数signal(SIGCHLD,SIG_IGN;2调用fork两次。程序8 - 5 实现了这一点。3用waitpid等待子进程返回.=zombie进程是僵死进程。防止它的办法,一是用wait,waitpid之类的函数获得进程的终止状态,以释放资源。另一个是fork两次=defunct进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的process个数的限制已经快超过了,zombie进程不会有更多的坏处。可能唯一的
7、方法就是reboot系统可以消除zombie进程。=任何程序都有僵尸状态,它占用一点内存资源(也就是进程表里还有一个记录,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill 是无任何效果的fork与zombie/defunct在Unix下的一些进程的运作方式。当一个进程死亡时,它并不是完全的消失了。进程终止,它不再运行,但是还有一些残留的小东西等待父进程收回。这些残留的东西包括子进程的返回值和其他的一些东西。当父进程fork(一个子进程后,它必须用wait( 或者waitpid( 等待子进程退出。正是这个wait( 动作来让子进程的残留物消失。自然的
8、,在上述规则之外有个例外:父进程可以忽略SIGCLD 软中断而不必要wait(。可以这样做到(在支持它的系统上,比如Linux:main(signal(SIGCLD, SIG_IGN;.fork(;fork(;fork(;现在,子进程死亡时父进程没有wait(,通常用ps 可以看到它被显示为“”。它将永远保持这样直到父进程wait(,或者按以下方法处理。这里是你必须知道的另一个规则:当父进程在它wait(子进程之前死亡了(假定它没有忽略SIGCLD,子进程将把init(pid1进程作为它的父进程。如果子进程工作得很好并能够控制,这并不是问题。但如果子进程已经是defunct,我们就有了一点小麻
9、烦。看,原先的父进程不可能再wait(,因为它已经消亡了。这样,init 怎么知道wait( 这些zombie 进程。答案:不可预料的。在一些系统上,init周期性的破坏掉它所有的defunct进程。在另外一些系统中,它干脆拒绝成为任何defunct进程的父进程,而是马上毁灭它们。如果你使用上述系统的一种,可以写一个简单的循环,用属于init的defunct进程填满进程表。这大概不会令你的系统管理员很高兴吧?你的任务:确定你的父进程不要忽略SIGCLD,也不要wait( 它fork( 的所有进程。不过,你也未必要总是这样做(比如,你要起一个daemon 或是别的什么东西,但是你必须小心编程,如果你是一个fork(的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 九年级化学下册 9.1 溶液的形成教学实录1 (新版)新人教版
- 《八 不确定现象》(教案)西师大版四年级数学上册
- 四年级上册数学教案-4.2 加法交换律和乘法交换律(3)-北师大版
- 制定科学的招聘与选拔流程计划
- 离婚协议房子归男方(2025年版)
- 生物教育与社会热点议题结合计划
- 加强急诊科与其他科室的协调合作计划
- 怎制作朗读课件
- 2024年九年级化学上册 实验5《一定浓度溶液的配置》教学实录 (新版)湘教版
- 2025年应急救生系统合作协议书
- 中华人民共和国统计法
- 千分尺完整(公开课用)课件
- 三年内无重大违法记录声明
- LED显示屏培训资料
- 互联网行业网络安全事件案例解析
- DB14-T 2952-2023 食品小作坊、小经营店、小摊点落实食品安全主体责任工作指南
- 新概念英语1Lesson-85-86-(共39张课件)
- 《物联网通信技术》课件-第六章 5G通信
- 2024年小学语文新部编版一年级上册全册教案
- 密码学课件 古典密码学
- GB/T 44438-2024家具床垫功能特性测试方法
评论
0/150
提交评论