Linux的僵尸进程及其解决方法

摘要:   Linux的僵尸进程及其解决方法  1. 产生原因:  在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是 ...
Linux的僵尸进程及其解决方法
1. 产生原因:
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
2. 原理分析:
每个Unix进程在进程表里都有一个进入点(entry),核心进程执 行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个 进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。
子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。那么会不会因为父进程太忙来不及 wait 子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?不会。因为UNIX提供了一种机制可以保证,只要父进程想知道子进程结束时的状态信息,就可以得到。这种机制就是:当子进程走完了自己的生命周期后,它会执行exit()系统调用,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运行时间the amount of CPU time taken by the process等),这些数据会一直保留到系统将它传递给它的父进程为止,直到父进程通过wait / waitpid来取时才释放。
3.解决方法:
(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。
(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。
(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号
(4)fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。

转载于:https://www.cnblogs.com/burness/p/3364886.html

Linux的僵尸进程及其解决方法(转)相关推荐

  1. linux服务器time wait,Linux服务器TIME_WAIT进程的解决与原因

    linux服务器上tcp有大量time_wait状态的解决方法和原因解释 毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态,TIME_WAIT状态存在于主动关闭socket连接 ...

  2. linux 识别僵尸进程,Linux上寻找并杀死僵尸进程

    转载: http://blog.csdn.net/shanzhizi/article/details/47320595 linux服务器上,多少会出现一些僵尸进程,下面介绍如何快速寻找和消灭这些僵尸进 ...

  3. linux下僵尸进程(<defunct>进程)的产生与避免

    一.什么是僵尸进程 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程.当用ps命令观察进程的执行状态时,看到这些进程的状态栏为 ...

  4. linux系统安装软件报错,Linux安装软件时报错解决方法

    提示 Could not get lock /var/lib/dpkg/lock 报错? 有些小伙伴在使用 apt 包管理器更新或安装软件时,可能会遇到过诸如以下的错误提示: E: Could not ...

  5. linux孤儿进程组深入理解,LInux下僵尸进程与孤儿进程是如何产生的?

    1:如何产生: 僵尸进程,先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程. 孤儿进程:该进程的父进程先于自身终止.其 ...

  6. linux故障报错及解决方法

    问题1.Read-only file system 错误与解决方法. 解析:出现这个问题的原因有很多种,可能是文件系统数据块出现不一致导致的,也可能是磁盘故障造成的,主流ext3/ext4文件系统都有 ...

  7. Linux系统安装时报错,Linux安装软件时报错解决方法

    提示 Could not get lock /var/lib/dpkg/lock 报错? 有些小伙伴在使用 apt 包管理器更新或安装软件时,可能会遇到过诸如以下的错误提示:E: Could not ...

  8. 虚拟机安装linux系统无法上网的解决方法

    虚拟机安装linux系统无法上网的解决方法 参考文章: (1)虚拟机安装linux系统无法上网的解决方法 (2)https://www.cnblogs.com/liuqiyun/p/9585643.h ...

  9. linux网卡有很多error,教你设置win7系统虚拟机安装linux提示network error的解决方法...

    很多朋友在使用电脑的过程中,会发现win7系统虚拟机安装linux提示network error的现象,当遇到win7系统虚拟机安装linux提示network error的问题,我们要怎么解决呢?如 ...

最新文章

  1. NEC:借助AI撬动未来物联网世界
  2. 【FPGA】SRIO IP核系统总览以及端口介绍(二)(I/O Port 含义介绍)
  3. [BZOJ 2756] 奇怪的游戏
  4. Oracle数据库操作注意事项
  5. Java基础:详解HashMap在多线程下不安全
  6. JVM系列之:String.intern的性能
  7. 《剑指offer》二进制中1的个数
  8. 玩转mini2440开发板之【linux内核的编译和下载】
  9. DSOFramer使用说明(转载)))
  10. 为什么双重检查锁模式需要 volatile ?
  11. 加工中心宏程序c语言,加工中心最实用的宏程序
  12. bat脚本打开cmd执行命令
  13. APS 生产排单系统设计
  14. 模板的选择和结合部位可塑性处理对GPCRs虚拟筛选性能影响
  15. WIFI 国家码和信道划分
  16. MacBook(m1) 通过brew安装PHP环境
  17. Lifecycle的基本使用和原理
  18. WEB页面或者H5页面如何打开高德或者百度地图APP导航(实战向)
  19. 认知安全:安全分析师的超级助手
  20. 解决小程序自定义弹窗滚动穿透问题

热门文章

  1. Java构造和解析Json数据的两种方法详解一
  2. /etc/passwd /etc/shadow 详解
  3. leetcode算法题--K站中转内最便宜的航班★
  4. html 弹出遮罩 iframe,iframe正在加载时显示遮罩层 加载完毕后显示iframe
  5. python to_excel_Pandas DataFrame.to_excel()用法详解
  6. linux中看挂载的磁盘用什么命令,使用Linux命令行挂载硬盘和分区 | MOS86
  7. php7.2 开启mcy扩展,phper必知必会(二)
  8. 微信打开网页下载东西时如何调用其他浏览器下载
  9. PHP的抽象类、接口的区别和选择
  10. You should rebuild using libgmp = 5 to avoid timing attack vulnerability