僵尸进程(zombie process)
首先了解一下linux中进程的5大状态:
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
D Uninterruptible sleep (usually IO)
T Stopped, either by a job control signal or because it is being traced.
Z Defunct ("zombie") process, terminated but not reaped by its parent.
状态转换关系图:
僵尸进程是指一个已经结束运行,但是其父进程尚未对其进行善后处理的进程。那么为什么一个进程结束运行之后,父进程要对它进行善后处理呢?善后处理做了什么事呢?
具体来说就是,一个进程结束运行之后,该进程并没有被彻底销毁,内核仍然为该进程维护了一些信息(进程ID、该进程的终止状态以及该进程使用的CPU时间总量)。父进程可以通过调用wait()/waitpid()来获取这些信息,并最终销毁该进程。
如何避免僵尸进程的产生呢?
1. 父进程通过调用wait()/waitpid()等待子进程结束。(这会导致父进程被挂起)
2. 如果父进程很忙,不想被挂起,可以通过signal函数设置SIGCHLD信号的handler,在handler中调用wait()/waitpid()。
(子进程结束时,内核会向父进程发送SIGCHLD信号,父进程对该信号的默认处理是忽略。)
3. 父进程通过signal(SIGCHLD, SIG_IGN)显示忽略SIGCHLD信号,这样子进程结束后,内核不在向父进程发送SIGCHLD信号,内核负责回收子进程。
4. 两次fork()。
父进程fork()出子进程,子进程fork()出孙进程后退出,孙进程结束运行后,由于其父进程已经退出,因此由init进程接管。init进程会负责该进程的销毁工作。
如何清除僵尸进程呢?
kill命令无法杀死僵尸进程,但是我们可以kill僵尸进程的父进程,这样僵尸进程就会变成孤儿进程,然后由init进程接管。
僵尸进程(zombie process)的更多相关文章
- linux 杀掉僵尸进程 (zombie process, defunct)
本文说明为什么会出现僵尸进程 (zombie process, defunct),以及如何杀掉僵尸进程 1. 为什么有僵尸进程 僵尸进程出现在父进程没有回收子进程的 PCB 的时候,这个时候子进程已经 ...
- Linux 僵尸进程查杀
僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...
- Linux 僵尸进程
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...
- Linux 僵尸进程如何处理
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...
- 并发编程(二)--利用Process类开启进程、僵尸进程、孤儿进程、守护进程、互斥锁、队列与管道
一.multiprocessing模块 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. 2.mu ...
- 并发编程(二)——利用Process类开启进程、僵尸进程、孤儿进程、守护进程、互斥锁、队列与管道
Process类与开启进程.守护进程.互斥锁 一.multiprocessing模块 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模 ...
- 僵尸进程的产生和避免,如何kill杀掉linux系统中的僵尸defunct进程
在 Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的"僵尸"进程."僵尸"进程是一个早已 死亡的进程 ...
- [Linux] 孤儿进程与僵尸进程[总结]
转载: http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两 ...
- <转载>僵尸进程
转载http://www.cnblogs.com/scrat/archive/2012/06/25/2560904.html 什么是僵尸进程 僵尸进程是指它的父进程已经退出(父进程没有等待(调用wai ...
随机推荐
- AD颗粒化密码规则策略
我们在第一次设定密码规则的时候,通常会在根节点或者默认组策略中设置 如果,我们在后期运维过程中,有一些特殊用户需要设置额外的密码策略,我们要如何操作呢? 可能,有些同学会在这些特殊用户对应的OU下在创 ...
- 011-指针(上)-C语言笔记
011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...
- Pytest系列(23)- allure打标记,@allure.feature()、@allure.story()、@allure.severity()的详细使用
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 前面几篇文章主要介绍了all ...
- windows/linux下如何更换Python的pip源
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:xlixiaohui PS:如有需要Python学习资料的小伙伴可以 ...
- vue组件之间值传递四种方法汇总
1.父组件获取子组件的数据和方法 $refs 子组件: <template> <div class="header"> <h3>{{ zz }} ...
- JMeter分布式压测-常见问题之( Cannot start. localhost.localdomain is a loopback address)
问题描述: JMeter分布式测试时,以Linux系统作为被测服务器,在其中启动 jmeter-server 服务时出现异常,系统提示如下: [root@localhost bin]# ./jmete ...
- 终于明白if __name__ == '__main__':了
其实很简单 if __name__ == '__main__': 就是一个判断 __name__是系统变量 __name__有一个特性,在当前文件运行是__main__,调用文件就是调用文件的路径了 ...
- MVC-第一个简单的程序
来源于:https://www.cnblogs.com/miro/p/4030622.html 从空白开始,建立一个基本框架详细步骤 1,新建项目 NOTE:模板要选Empty,如果直接选MVC会产生 ...
- blink测试技术介绍
引言: flink是面向数据流处理和批处理的分布式开源计算框架.2016年阿里巴巴引入flink框架,改造为blink,将其运用到搜索及推荐的离线实时计算中,成功解决了搜索.推荐实时大数据量计算的痛点 ...
- Java集合linkdList
LinkedList特有功能: A:添加功能 public void addFitst(Object e) public void addLast(Object e) B:获取功能 public Ob ...