嵌入式培训
达内IT学院
400-996-5531
嵌入式新手如何有效解决linux系统下的僵尸进程,下面是来自达内教育小编整理的关于解决僵尸进程的方法的总结。
一、产生原因
进程结束时都做些什么呢? 做这么几件事情:
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会回收。不过子进程的回收还要父进程来做。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved