Linux系统寻找和杀掉僵尸进程

本文介绍了一个简单的C程序,该程序能够创建10个僵尸进程。通过编译和运行此程序,可以观察到僵尸进程的形成过程。僵尸进程是指已终止但其父进程尚未对其进行清理的子进程。文章还提供了如何通过命令行操作来检查和清除这些僵尸进程的方法。

vim zombie.c

---------------------------

#include <stdio.h>


#include <unistd.h>

#include <errno.h>

#include <stdlib.h>


int main()

{


int i;


pid_t pid;

for (i = 0; i < 10; ++i)

{


pid = fork();

switch(pid)

{

case -1:

perror("fork");

exit(-1);

case 0: //child

printf("I am child");

exit(0);


default:

break;


}

}


while (1)

{

sleep(1);


printf("I am parent\n");


}

return 0; //will never reach here


}

-----------------------------------------------

这段程序就可以产生10个僵尸进程,编译执行后ps -ef查看,<defunct>就表示僵尸进程。原理是产生子进程之后它只打印一句话就退出,而父进程最终进入while无限循环,所以不退出,并且它没有调用wait()或者waitpid()函数清理子进程,所以子进程全部成为僵尸进程;如果父进程退出,那么不会产生僵尸进程,因为子进程被过继给1号进程(init进程),init进程负责清理子进程。



编译生成zombie文件,并运行zombie

gcc -o zombie zombie.c

./zombie


查出僵尸进程:

top

ps -e -o stat,ppid|grep -e '^[Zz]'



杀死僵尸进程:

kill -HUP `ps -e -o stat,ppid|grep -e '^[Zz]'|awk '{print $2}'|sort|uniq`















本文转自leonardos51CTO博客,原文链接: http://blog.51cto.com/leomars/1888777,如需转载请自行联系原作者



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值