千家信息网

Linux中怎么杀死defunct进程

发表于:2025-02-20 作者:千家信息网编辑
千家信息网最后更新 2025年02月20日,Linux中怎么杀死defunct进程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、什么是defunct进程(僵尸进程)在 Linu
千家信息网最后更新 2025年02月20日Linux中怎么杀死defunct进程

Linux中怎么杀死defunct进程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、什么是defunct进程(僵尸进程)
在 Linux 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。当用ps命令观察进程的执行状态时,看到这些进程的状态栏为defunct。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。

二、 Linux下进程的运作方式
每个 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


假设得到的输出如下所示:

代码如下:


8328 ? 00:00:00 mono
8522 ? 00:00:01 mono
13132 ? 00:00:00 mono
25822 ? 00:00:00 ruby
28383 ? 00:00:00 ruby
18803 ? 00:00:00 ruby


这意味着存在6个defunct进程:3个mono进程,以及3个ruby进程。这些进程之所以存在,可能是因为应用程序写得很烂或者用户做了不常见的操作,在我这,一定是我写的mono C#程序存在严重问题 :smile: 。
现在,我们来看看这些进程的ID及其父进程ID:

代码如下:


$ ps -ef | grep defunct | more


以上命令的输出如下:

代码如下:


UID PID PPID ...
---------------------------------------------------------------
kenno 8328 6757 0 Mar22 ? 00:00:00 [mono]
kenno 8522 6757 0 Mar22 ? 00:00:01 [mono]
kenno 13132 6757 0 Mar23 ? 00:00:00 [mono]
kenno 25822 25808 0 Mar27 ? 00:00:00 [ruby]
kenno 28383 28366 0 Mar27 ? 00:00:00 [ruby]
kenno 18803 18320 0 Apr02 ? 00:00:00 [ruby]


UID:用户ID
PID:进程ID
PPID:父进程ID
如果你使用命令 "kill -9 8328" 尝试杀死ID为8328的进程,可能会没效果。要想成功杀死该进程,需要对其父进程(ID为6757)执行kill命令($ kill -9 6757)。对所有这些进程的父进程ID应用kill命令,并验证结果($ ps -A | grep defunct)。

看完上述内容,你们掌握Linux中怎么杀死defunct进程的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

进程 系统 信息 僵尸 命令 进程表 状态 代码 数据 时候 运行 方法 程序 问题 内存 内容 就是 更多 有限 机制 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2021.10.4 连接服务器失败原因 把doc文档保存到数据库中 国内好的电商软件开发商 数据库个案信息如何删除 网络安全管理如何开展工作 be服务器自动停止 网络安全的讲座 海南耀天网络技术有限公司游戏客服电话 长沙芯泰软件开发公司产品销量 软件开发与系统集成 织梦数据库文章内容替换 人民网络安全专项整治 可以管理服务器的协议 湖北pdu服务器专用电源供应商 数据库设计面临什么挑战 服务器内存卡型号怎么看 软件开发管理互联网 数据库规范化基础知识 索尼电视 投屏 无法访问服务器 车载云台支架软件开发 计算机网络技术是否可以考二建 hulu北京软件开发有限公司 软件开发行业公司规章制度 网络安全股票涨幅 网络安全哪些 哈工大网络安全ppt 哪个网站宣传我的世界服务器 服务器机柜市场 家里电脑无法连接到代理服务器 网络安全板块为什么突然启动
0