新手入门学习之如何有效解决僵尸进程

时间:2013-10-15 10:34来源:IT实验室 作者:sunplusedu 点击:
   新手入门学习如何有效解决僵尸进程,下面是来自凌阳教育网小编整理的关于解决僵尸进程的方法的总结。
 
    一、产生原因
    进程结束时都做些什么呢? 做这么几件事情:
    1)  释放资源,包括内存资源,文件标识符,数据库连,设备资源等等
    2)  调用exit系统调用
    3)  修改进程表状态为“僵死”状态(Zombie),使用ps –el查看状态为“Z”,进程表保存的信息包括:进程ID、进程状态、运行时间等等
    4)  发送信号SIGHUP给父进程(除INIT进程外,其他进程都有父进程),等待其回收进程表资源
    因此进程结束之后,并没有完全结束,而是进入了“僵死”状态,等待父进程回收;
父进程回收之前,僵死进程基本不占任何资源,仅仅占系统进程表的一个进程号和一条记录,由于系统的进程号资源是有限的,如果系统产生大量的僵死进程,会导致系统无法产生新进程。
 
    二、查看方法
    ps –ely    #S列为Z值的记录
    #linux系统下,自动脚本
    ps –ely | gawk ‘$1==”Z”’
    或者
    ps –ef | grep “defunct” | grep –v  “grep”
    复杂点的脚本:lZombie.sh
    cat lZombie.sh
    #look for processes of zombie state
    #get the position of “S” state
    i=1
    ps –ely| awk ‘NR==1’| while read line
    do
    if [ $line = “S” ]
    then
    break
    fi
    done
    #print the info of zombie processes
    ps –ely| awk ‘$”’$i’”==”Z”’
#或者 ps –ely| awk ‘$’$i’==”Z”’
 
    三、处理方法
    1)       通知父进程子进程回收僵死进程
    Kill –s SIGCHLD PPID
    2)       如果确认父进程及其子进程已经“无用“,则直接杀死父进程及其子进程,INIT拖挂僵死进程后会自动清理之
    Kill –s SIGTERM PPID PID1 PID2
或kill -15 PPID PID1 PID2
 
    四、如何避免
    1)  父进程通过wait或waitid等函数回收僵死子进程
    2)  子进程结束时,主动发送SIGCHLD信号给父进程,父进程在信号处理模块调用wait函数
    3)  父进程不关心子进程什么时候结束,那么可以使用signal(SIGCHLD, SIG_IGN)通知内涵,父进程对子进程不感兴趣,那么子进程结束后,内核直接回收;或者用sigaction函数为SIGCHLD信号设置SA_NOCLDWAIT:
    struct sigaction sa;
    sa.sa_handler = SIG_IGN;
    sa.sa_flags = SA_NOCLDWAIT;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGCHLD, &sa, NULL);
    4)  fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要父进程来做。
 
 
分享到:

凌阳教育嵌入式培训——全国唯一“原厂嵌入式培训”机构,全国唯一“按班公布学员就业去向”的诚信机构

关注我们:

全国免费咨询电话:156-0117-5697或010-62981113(转2824) 服务监督电话:010-62981113-2800

京ICP备09010168号  京公网安备11010802010586号

北京嵌入式培训中心:海淀区上地信息产业基地中黎科技园1号楼3层A段

Copyright © 2017 SunplusEdu Inc. All Rights Reserved