更多课程 选择中心

嵌入式培训
达内IT学院

400-996-5531

嵌入式新手如何有效解决linux系统下的僵尸进程?

  • 发布:嵌入式培训
  • 来源:嵌入式问答
  • 时间:2017-11-09 11:02

嵌入式新手如何有效解决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会回收。不过子进程的回收还要父进程来做。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:什么是嵌入式开发?
下一篇:嵌入式系统如何选择微控制器?

嵌入式新手如何去自学嵌入式呢?

嵌入式新手入门须知

Linux系统中的”队列”是什么?

嵌入式新手如何学习嵌入式?

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省