分页: 1 / 2

Zombie程序

发表于 : 2007-08-01 11:04
vcxzfdsarewq
今天top时有两个Zombie程序
kill不掉,是scim和netstat
我的scim还是能输入的
请高手指点一下

发表于 : 2007-08-01 11:06
eexpress
又见Zombie。。。我打仗的时候,经常看到自己的ping是这个哦。哎。

killall -9 scim-xxxxx

发表于 : 2007-08-01 11:28
vcxzfdsarewq
eexpress 写了:又见Zombie。。。我打仗的时候,经常看到自己的ping是这个哦。哎。

killall -9 scim-xxxxx
杀不掉的,statnet的PPID是swiftfox,重启后还是有
scim的PPID是X-session-manager也是重启后有
用什么好的办法吗?

发表于 : 2007-08-01 12:27
eexpress
不会吧。 -9都不行?????你sudo了????????

发表于 : 2007-08-01 12:42
vcxzfdsarewq
eexpress 写了:不会吧。 -9都不行?????你sudo了????????
sudo 了,切换到superuser都不行

root@ubuntu:/etc# ps aux |grep "defunct"
hitch 5888 0.0 0.0 0 0 ? Z 11:25 0:00 [scim] <defunct>
root 6355 0.0 0.0 2884 752 pts/1 R+ 12:43 0:00 grep defunct
root@ubuntu:/etc# killall -9 scim
root@ubuntu:/etc# ps aux |grep "defunct"
hitch 5888 0.0 0.0 0 0 ? Z 11:25 0:00 [scim] <defunct>
root 6373 0.0 0.0 2884 752 pts/1 R+ 12:43 0:00 grep defunct

发表于 : 2007-08-01 13:06
nobrain
看看这两个zombie进程的父进程是哪个

发表于 : 2007-08-01 13:16
vcxzfdsarewq
nobrain 写了:看看这两个zombie进程的父进程是哪个
是x-session-manag
我用killall -2 x-session-manag 重启后还是不行

发表于 : 2007-08-01 19:51
xhy
zomble进程是杀不掉的 唯一的办法就是重启

当子进程退出时 就会进入zomble状态 内核给子进程记录一些信息到一张表中
直到父进程调用wait系列系统调用去取回这些信息 子进程才能正常退出

发表于 : 2007-08-01 19:59
蓝蓝
顽症

发表于 : 2007-08-01 20:15
nobrain
xhy 写了:zomble进程是杀不掉的 唯一的办法就是重启

当子进程退出时 就会进入zomble状态 内核给子进程记录一些信息到一张表中
直到父进程调用wait系列系统调用去取回这些信息 子进程才能正常退出
或者把父进程咔嚓啦,由init进程wait

发表于 : 2007-08-01 21:11
xhy
nobrain 写了:
xhy 写了:zomble进程是杀不掉的 唯一的办法就是重启

当子进程退出时 就会进入zomble状态 内核给子进程记录一些信息到一张表中
直到父进程调用wait系列系统调用去取回这些信息 子进程才能正常退出
或者把父进程咔嚓啦,由init进程wait

一个进程退出时,内核会逐个检查系统中的活动进程,把所有这个进程的子进程的ppid改为1
而zomble中的进程不是活动进程 因此不会被init领养

一般遇到zomble可以无视 因此zomble仅仅占用一个进程描述符 以及少量的终止信息
对系统的影响忽略不计

如果在服务器中有大量的zomble出现 可能会导致达到进程上限 无法创建新的进程

个人使用的话 10000个zomble都无所谓的

发表于 : 2007-08-02 11:33
nobrain
xhy 写了:一个进程退出时,内核会逐个检查系统中的活动进程,把所有这个进程的子进程的ppid改为1
而zomble中的进程不是活动进程 因此不会被init领养
在父进程退出的时候,zombie的子进程会被init领养的,写个程序就可以验证了。

代码: 全选

$ uname -r
2.6.20-16-generic

代码: 全选

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
	switch(fork())
	{
		case -1:
			fprintf(stderr, "fork() failed\n");
			return EXIT_FAILURE;
			break;
		case 0: /* child process */
			printf("This is child pid = %ld\n",
					(long)getpid());
			switch(fork())
			{
				case -1:
					fprintf(stderr," fork failed\n");
					exit(EXIT_FAILURE);
					break;
				case 0:
					printf("grand process pid = %ld\n",
							(long)getpid());
					sleep(4);
					exit(EXIT_SUCCESS);
					break;
				default:
					break;
			}
			exit(EXIT_SUCCESS);
			break;
		default:
			break;
	}
	sleep(10);
	exit(EXIT_SUCCESS);
}
运行这个程序,并观察系统监视器。
父进程创建了子进程,子进程处于zombie状态。子进程的子进程即孙进程在sleep了4秒之后,先于父进程退出,但是这个孙进程并没有处于zombie状态,而是消失了。此时,子进程仍然存在并处于zombie状态。似乎zombie进程的子进程也被init领养了。

发表于 : 2007-08-02 12:26
skyx
比较相信楼上

发表于 : 2007-08-02 13:36
xhy
linux 2.6的内核 + 近期版本的init 下实验过
父进程正常退出的情况下 确实可以回收大部分defunct进程
solaris9,AIX下情况不同

更正一下我上面的说法
严格的说回收僵尸进程不是内核的职责
这个工作是init做的 init定期检查并且回收
linux(2.6)下是这样的
unix下有所不同

两次fork可以避免僵尸进程 因此不能作为实验例子
我用的是其它测试程序

发表于 : 2007-08-02 13:38
BigSnake.NET
父进程的缺陷,基本上可以无视