遇到Linux僵尸进程该怎么办

首页 > 西方诗歌 > 文章

遇到Linux僵尸进程该怎么办

一些僵尸进程是我们每个人都头疼的问题,这些进程不但占用内存还影响运行速率,今天给大家分享的就是在Linux下解决僵尸进程的方法。 在UNIX体系中,一个进程完毕了,可是他的父进程没有等候(调用wait/waitpid)他,那么他将变成一个僵尸进程.在fork()/execve()进程中,假设子进程完毕时父进程仍存在,而父进程fork()之前既没装置SIGCHLD信号处理函数调用waitpid()等候子进程完毕,又没有显式疏忽该信号,则子进程成为僵尸进程。

一个进程在调用exit指令毕自己的生命的时分,其实它并没有真实的被毁掉,而是留下一个称为僵尸进程(Zombie)的数据结构(体系调用exit,它的作用是使进程退出,但也只是限于将一个正常的进程变成一个僵尸进程,并不能将其彻底毁掉)进程的损害由于子进程的完毕和父进程的运转是一个异步进程,即父进程永久无法预测子进程究竟什么时分完毕.那么会不会由于父进程太忙来不及wait子进程,或许说不知道子进程什么时分完毕,而丢掉子进程完毕时的状况信息呢不会。 由于UNⅨ供给了一种机制能够确保只需父进程想知道子进程完毕时的状况信息,就能够得到。 这种机制就是:在每个进程退出的时分,内核开释该进程一切的资源,包含翻开的文件,占用的内存等。

可是依然为其保存必定的信息(包含进程号theprocessID,退出状况theterminationstatusoftheprocess,运转时刻theamountofCPUtimetakenbytheprocess等)。 直到父进程经过wait/waitpid来取时才开释.但这样就导致了问题,如果进程不调用wait/waitpid的话,那么保存的那段信息就不会开释,其进程号就会一向被占用,可是体系所能运用的进程号是有限的,如果大量的发生僵死进程,将由于没有可用的进程号而导致体系不能发生新的进程.此即为僵尸进程的损害,应当防止。 1、怎么检查僵尸进程怎么检查体系上的僵尸进程,怎么计算有多少僵尸进程仿制代码代码如下:#ps-ef|grepdefunct或许查找状况为Z的进程,Z就是代表zombieprocess,僵尸进程的意思。 别的运用top指令检查时有一栏为S,如果状况为Z阐明它就是僵尸进程。 仿制代码代码如下:Tasks:95total,1running,94sleeping,0stopped,0zombietop指令中也计算了僵尸进程。

或许运用下面的指令:仿制代码代码如下:ps-ef|grepdefunct|grep-vgrep|wc-l2、怎么杀死僵尸进程一般僵尸进程很难直接kill掉,不过您能够kill僵尸爸爸。

父进程身后,僵尸进程成为孤儿进程,过继给1号进程init,init始终会担任清理僵尸进程.它发生的一切僵尸进程也跟着消失。 仿制代码代码如下:ps-e-oppid,stat|grepZ|cutd-f2|xargskill-9或仿制代码代码如下:kill-HUP`ps-A-ostat,ppid|grep-e^[Zz]|awk{print$2}`当然您能够自己编写更好的shell脚本,欢迎与我们共享。

别的子进程身后,会发送SIGCHLD信号给父进程,父进程收到此信号后,履行waitpid()函数为子进程收尸。

就是根据这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD音讯,而此刻,虽然对它的默许处理是疏忽,如果想响应这个音讯,能够设置一个处理函数。 3、怎么防止僵尸进程处理SIGCHLD信号并不是有必要的。 但关于某些进程,特别是服务器进程往往在恳求到来时生成子进程处理恳求。

如果父进程不等候子进程结束,子进程将成为僵尸进程(zombie)然后占用体系资源。 如果父进程等候子进程完毕,将添加父进程的担负,影响服务器进程的并发功能。 在Linux下能够简略地将SIGCHLD信号的操作设为SIG_IGN。

signal(SIGCHLD,SIG_IGN);这样,内核在子进程完毕时不会发生僵尸进程。

这一点与BSD4不同,BSD4下有必要显式等候子进程完毕才干开释僵尸进程或许用两次fork(),并且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,然后init进程将担任铲除这个孤儿进程。 文章源自荣新科技官网:欢迎访问,转载需注明出处。