一、什么是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

12214 pts/18   00:01:14 python

16989 pts/18   00:04:43 python

20610 pts/18   00:23:12 python

1

2

3

4

看看这些进程的ID及其父进程ID:

$ ps -ef | grep defunct | more

1

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]

yourname    12214 12211  4 16:41 pts/18   00:01:14 [python]

yourname    16989 16986 20 16:45 pts/18   00:04:43 [python]

yourname    20610 18940 99 16:48 pts/18   00:23:12 [python]

1

2

3

4

5

6

7

UID:用户ID

PID:进程ID

PPID:父进程ID

如果你使用命令 “kill -9 12214” 尝试杀死ID为12214的进程,可能会没效果。

我们来试一下

$ kill -9 12214

$ ps -A|grep defunct

1

2

输出

5259 ?        00:00:00 sd_cicero

12214 pts/18   00:01:14 python

16989 pts/18   00:04:43 python

20610 pts/18   00:23:12 python

1

2

3

4

进程12214 仍然存才,说明用kill杀不掉它。

要想成功杀死该进程,需要对其父进程(ID为12211)执行kill命令($ kill -9 12211)。对所有这些进程的父进程ID应用kill命令,并验证结果($ ps -A | grep defunct)。

我们来试一下

$ kill -9 12211

$ ps -A|grep defunct

1

2

输出

5259 ?        00:00:00 sd_cicero

16989 pts/18   00:04:43 python

20610 pts/18   00:23:12 python

[1]   Killed                  bash main.sh

1

2

3

4

进程12214消失,说明可以通过kill僵尸进程的父进程来杀死僵尸进程。

如果前一个命令显示无结果,那么搞定!否则,可能你需要重启一下系统。

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

作者:DarrenXf

来源:CSDN

原文:https://blog.csdn.net/DarrenXf/article/details/82970809

版权声明:本文为博主原创文章,转载请附上博文链接!

linux里面有mysql的僵尸进程_Linux中的defunct进程(僵尸进程)相关推荐

  1. linux怎么查询mysql服务端口占用_LINUX中如何查看某个端口是否被占用的方法

    之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 3306(此处 ...

  2. linux怎么查询mysql服务端口占用_linux中如何查看某个端口是否被占用

    之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat  -anp  |grep   端口号 如下,我以3306为例,netstat  -anp  |grep   ...

  3. linux怎么查看mysql安装在哪里_Linux下查看MySQL的安装路径

    Linux下查看mysql.apache是否安装,并卸载. 指令ps -ef|grep mysql得出结果 root 17659 1 0 2011 ? 00:00:00 /bin/sh /usr/bi ...

  4. linux解压mysql文件命令行_linux mysql命令

    1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令: mys ...

  5. potplayer 多个进程_Linux系统编程1.2:进程概念简介

    进程是操作系统中最重要的概念之一. 一.进程的概念 在UNIX/Linux中, 进程是正在执行的程序, 它相当于Windows环境内的任务.每个进程包括程序代码和数据.其中数据包含程序变量数据.外部数 ...

  6. 根据用户查进程_Linux中的系统进程管理

    一.查看静态进程统计信息 格式:ps [选项] 常用命令选项 a:显示当前终端下的所有进程信息 u:使用以用户为主的格式输出进程信息 x:显示当前用户在所有终端下的进程信息 -e:显示系统内的所有进程 ...

  7. linux重设mysql密码是多少_Linux学习:重设mysql root密码

    ## 20160331 忘记 root密码 1.参考 重设mysql root密码 http://www.111cn.net/database/mysql/43957.htm 2. 停止mysql s ...

  8. linux忘记mysql登录用户密码_linux中忘记mysql用户root密码解决方案

    1.vim /etc/my.cnf [mysqld] skip-grant-tables ##追加此行,跳过权限表, 2.重启mysql systemctl restart mysqld 3.mysq ...

  9. linux 查看进程_Linux怎么查看和监控每个进程的实时流量

    请关注本头条号,每天坚持更新原创干货技术文章.如需学习视频,请在微信搜索公众号**"智传网优"**直接开始自助**视频学习** 1. 前言 NetHogs是一个开源的命令行工具(类 ...

最新文章

  1. android 异常打印
  2. C语言实现linear search线性搜索算法(附完整源码)
  3. facenet 中心损失函数(center loss)详解(代码分析)含tf.gather() 和 tf.scatter_sub()函数
  4. 安卓Selector
  5. 机电传动控制大作业 第一阶段
  6. rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)
  7. 算法移植优化(一)android 学习笔记
  8. Linux-删除文件空间不释放问题解决
  9. 181212每日一句
  10. 爬虫的一些知识点 目录 1. 网络爬虫 1 2. 产生背景 垂直领域搜索引擎 2 3. 1 聚焦爬虫工作原理以及关键技术概述 3 4. 涉及技术 3 4.1. 下载网页 一般是通过net api
  11. java基础题100道
  12. love2d 编译 android,Love2D游戏脚本在windows平台下打包exe发布教程
  13. apache poi excel word 加密,不用借助其他jxcell.jar包
  14. 【硕士论文】《动态场景下的语义三维地图构建 》西南科技大学 余东应
  15. 华硕 ROG Win11.21H2 x64极速精简优化专业版
  16. 轻量级网络:ResNeXt
  17. spring集成kafka运行时报错:Failed to construct kafka producer] with root cause
  18. Android自定义View实现折线统计图
  19. 软件开发过程中的各种图
  20. 【python爬虫专项(29)】链家二手房源数据采集2(深度信息采集)

热门文章

  1. 怎么用twilio发送免费短信.
  2. 游戏设计中的纹理贴图
  3. 几个免费的nodejs空间
  4. 一个外行人学习一下TBOX 测试
  5. 关于对称归一化的拉普拉斯矩阵为何选用度矩阵D的逆平方根
  6. 使用 node.js 爬取页面数据
  7. #ifdef vs #if defined 的差异
  8. JAVA WeakReference
  9. Qt从视频中获取每一帧数据
  10. FRP+Docker+windows搭建内网穿透,实现外网访问家里的Windows