Linux中的defunct进程(僵尸进程)

作者&投稿:悟放 (若有异议请与网页底部的电邮联系)
~ 一、什么是defunct进程(僵尸进程)?
在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。当用ps命令观察进程的执行状态时,看到这些进程的状态栏为defunct。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
二、 Linux下进程的运作方式
如果子进程先于父进程退出, 同时父进程又没有调用wait/waitpid,则该子进程将成为僵尸进程。如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个 进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动 wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
每个 Linux进程在进程表里都有一个进入点(entry),核心进程执行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。
子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。那么会不会因为父进程太忙来不及 wait 子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?
不会。因为 Linux提供了一种机制可以保证,只要父进程想知道子进程结束时的状态信息,就可以得到。这种机制就是:当子进程走完了自己的生命周期后,它会执行exit()系统调用,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运行时间the amount of CPU time taken by the process等),这些数据会一直保留到系统将它传递给它的父进程为止,直到父进程通过wait / waitpid来取时才释放。
也就是说,当一个进程死亡时,它并不是完全的消失了。进程终止,它不再运行,但是还有一些残留的数据等待父进程收回。当父进程 fork() 一个子进程后,它必须用 wait() (或者 waitpid())等待子进程退出。正是这个 wait() 动作来让子进程的残留数据消失。
三、僵尸进程的危害
如果父进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统的进程表容量是有限的,所能使用的进程号也是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。而且,由于调度程序无法选中Defunct 进程,所以不能用kill命令删除Defunct 进程,惟一的方法只有重启系统。
四、如何杀死defunct进程
defunct进程是指出错损坏的进程,父子进程之间不会再通信。有时,它们会演变成“僵尸进程”,存留在你的系统中,直到系统重启。可以尝试 “kill -9” 命令来清除,但多数时候不管用。
为了杀死这些defunct进程,你有两个选择:
1.重启你的计算机
2.继续往下读…
我们先看看系统中是否存在defunct进程:
$ ps -A|grep defunct
1
输出
5259 ? 00:00:00 sd_cicero <defunct>
12214 pts/18 00:01:14 python <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>

看看这些进程的ID及其父进程ID:
$ ps -ef | grep defunct | more
UID PID PPID ...
==========================================================================
yourname 4653 6128 0 17:07 pts/18 00:00:00 grep --color=auto defunct
yourname 5259 5258 0 15:58 ? 00:00:00 [sd_cicero] <defunct>
yourname 12214 12211 4 16:41 pts/18 00:01:14 [python] <defunct>
yourname 16989 16986 20 16:45 pts/18 00:04:43 [python] <defunct>
yourname 20610 18940 99 16:48 pts/18 00:23:12 [python] <defunct>

UID:用户ID
PID:进程ID
PPID:父进程ID
如果你使用命令 “kill -9 12214” 尝试杀死ID为12214的进程,可能会没效果。
我们来试一下
ps -A|grep defunct

输出
5259 ? 00:00:00 sd_cicero <defunct>
12214 pts/18 00:01:14 python <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>

进程12214 仍然存才,说明用kill杀不掉它。
要想成功杀死该进程,需要对其父进程(ID为12211)执行kill命令( ps -A | grep defunct)。
我们来试一下
ps -A|grep defunct

输出
5259 ? 00:00:00 sd_cicero <defunct>
16989 pts/18 00:04:43 python <defunct>
20610 pts/18 00:23:12 python <defunct>
[1] Killed bash main.sh

进程12214消失,说明可以通过kill僵尸进程的父进程来杀死僵尸进程。
如果前一个命令显示无结果,那么搞定!否则,可能你需要重启一下系统。

参考链接: https://www.cnblogs.com/lfxiao/p/10837115.html


linux 终端 运行 python
def weight_variable(shape):initial = tf.truncated_normal(shape, stddev=0.1);\\ return tf.Variable(initial);\\ 注意:输入函数块时注意缩进,否者会报出IndentationError: unexpected indent python错误。non-ascii character xe5 in file解决方法 原因:程序中的编码错误,python默认支持acii模式,但...

linux系统下邮件服务器sendmail的配置
VERSIONID(`linux setup for Red Hat Linux')dnl OSTYPE(`linux') dnl Uncomment and edit the following line if your mail needs to be sent out dnl through an external mail server: dnl define(`SMART_HOST',`smtp.your.provider') define(`confDEF_USER_ID',``8:12'')dnl undefine(`UUCP_RELAY...

linux中怎么统计本机网络接口配置文件中含有iface的共有多少行?_百度...
题主你好,前提: 我没有使用linux系统中真正的网络配置文件, 而是新建了一个hello.py的文件, 然后在里面写了3行内容:iface abc adf iface def --- 1.显示包含iface字符串的行数:2.显示包含iface字符串行的内容:希望可以帮到题主, 欢迎追问....

linux获取毫秒linux取毫秒
这个命令更多应用于shell脚本编程里和程序里 如下面的一段程序:应用程序:includesyswait.h> usleep(n)\/\/n微秒 Sleep(n)\/\/n毫秒 sleep(n)\/\/n秒 驱动程序:includelinux\/delay.h> mdelay(n)\/\/milliseconds其实现 ifdefnotdef definemdelay(n)({unsignedlongmsec=(n);while(msec--)udelay(1000...

linux的相对路径怎么表示
比如你当前路径为\/var\/log下,现在想要进到\/usr目录下 可以命令为 cd ..\/..\/usr #通过相对路径先退到\/var目录下,再退到\/下,最后进如\/usr下 相当路径是相对当前目录来说的。..\/ #表示上级目录 .\/ #表示当前目录下 .\/XXX #表示当前目录下的XXX文件或者XXX目录 使用相对路径不一定...

如何在 Linux 上设置密码策略
注意:xmodule是原作者在linux系统中使用的用户名。 显示如下:Last password change : Dec 30, 2013 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change ...

Linux常用命令
常用的命令有好多啊,你刚开始学,不用特意的去记,用到什么学什么就好了。 当然非要列举,下面列举的100条,是来自百度经验上的。 希望对你有帮助。Linux常用命令大全100条:1,echo “aa” 》 test.txt 和 echo “bb” 》》 test.txt \/\/》将原文件清空,并且内容写入到文件中,》》将内容...

如何在Linux操作系统中根据斜杠\/的数量对文本内容倒序排序呢?_百度...
建议你这样试试看:使用python的方式实现。在你想要到倒序的linux文件夹位置。新建一个py文件(命令 vi reverse.py)将代码复制上去。然后保存。coding=utf-8import sys def checkStr(str_source):return sum(map(lambda check: '\/'.count(check), str_source))def sortByLen(s):return len(s)if...

Linux命令,如何查看一个字符在字符串中出现的次数:‘asdefedgwe' 查看...
echo "asdefedgwe" | grep -o 'e' | wc -l echo "asdefedasdfasdfagwe" | tr -dc 'e' | wc -m echo "asdefedgwe" | awk '{s+=gsub(\/e\/,"&")}END{print s}'echo "asdefedasdfasdfagwe" | awk -v RS="e" 'END{print NR-1}'echo "asdefedasdfasdfagwe" | sed ...

我用usb启动U盘里的linux系统后,原来的windows系统的DEF盘不见了
不多解释,分区表损坏了。我以前DOS 操作GHSOT也有过丢分区 建议尝试用diskgenius修复分区表 请百度教程

简阳市18221487076: 如何kill杀掉linux系统中的僵尸defunct进程 -
可进氨麻: 吹侥承┙?痰淖刺?肝猟efunct,这就是所谓的僵尸进程.僵尸进程是一个早已 死亡的进程,但在进程表(processs table)中仍占了一个位置(slot).由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能...

简阳市18221487076: Linux中如何杀掉僵尸进程 -
可进氨麻: 1) 检查当前僵尸进程信息 # ps -ef | grep defunct | grep -v grep | wc -l175# top | head -2 top - 15:05:54 up 97 days, 23:49, 4 users, load average: 0.66, 0.45, 0.39 Tasks: 829 total, 1 running, 479 sleeping, 174 stopped, 175 zombie # ps -ef | grep ...

简阳市18221487076: linux如何杀死PPID为1的进程? -
可进氨麻: 某一个进程在结束时由它的父进程负责删除它.要找到某一个进程的父进程,执行ps -ef命令,输出中的PPID列给出了一个进程的父进程的进程号. (1)如果PPID为1应该如何做? 如果一个defunct进程的PPID为1,则该defunct进程的父进程为init...

简阳市18221487076: 如何杀死defunct进程 -
可进氨麻: Linux 中如何杀掉僵尸进程 1) 检查当前僵尸进程信息 # ps -ef | grep defunct | grep -v grep | wc -l 175 # top | head -2 top - 15:05:54 up 97 days, 23:49, 4 users, load average: 0.66, 0.45, 0.39 Tasks: 829 total, 1 running, 479 sleeping, 174 stopped, ...

简阳市18221487076: Linux 下如何结束指定进程 -
可进氨麻: 一般linux使用kill来结束进程 Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用...

简阳市18221487076: 简述Linux系统中的进程分为哪两类?分别以什么方式启动? -
可进氨麻: 分为独立进程和非独立进程. 一般情况下,在/etc/init.d这个目录中看到脚本都是独立进程的脚本,可以使用server 脚本名 start 来启动, 在/etc/xinetd.d目录中存放的都是非独立进程,可以使用以下两个命令启动 chkconfig 非独立进程名 on service xinetd restart

简阳市18221487076: LINUX 内核中进程标识符pid为 1,2,3,4,5的进程分别是什么名称?基本功能是什么? -
可进氨麻: 不知道你是不是学习编程的,如果不是就没必要看了.1.PID是进程标识号,它是一个进程的唯一性标识.PPID是该进程父进程的进程标识号.2.fork和exec和pid完全就是2件事情不能混为一谈.fork是一个linux库函数.他是用来创建一个新的进程.至于exec是一个系列函数,C标准库函数,用来改变进程上下文的.2者结合使用可以创建一个新的进程.3.如果创建新的进程,一般是用fork,他会返回这个被创建进程的PID,你可以通过PID找到这个进程.

简阳市18221487076: 如何在Linux中查看所有正在运行的进程 -
可进氨麻: 你可以使用ps命令.它能显示当前运行中进程的相关信息,包括进程的PID.Linux和UNIX都支持ps命令,显示所有运行中进程的相关信息.ps命令能提供一份当前进程的快照.如果你想状态可以自动刷新,可以使用top命令.ps命令 输入下面的...

简阳市18221487076: linux 下查看进程用什么命令 -
可进氨麻: linux 下查看进程可以使用的命令: 1、ps命令查找与进程相关的PID号: 2、ps a 显示现行终端机下的所有程序,包括其他用户的程序. 3、ps -A 显示所有程序. 4、ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻...

简阳市18221487076: 2. 简述Linux系统中的进程分为哪两类看你回答的这个问题 怎么 跟我们老师出的考试题 一模一样呢? -
可进氨麻:[答案] 朋友 一般就是两种进程 一种是系统进程 一种就是程序进程.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网