1:如何产生:

僵尸进程,先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源)。消灭僵尸进程的唯一方法是终止其父进程。

孤儿进程:该进程的父进程先于自身终止。其特点是PPID=1(init进程的ID)。一个孤儿进程可以自成孤儿进程组。

僵尸进程产生的原因:

一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

2:作用

僵尸进程:几乎没有什么作用;

孤儿进程:最经典的一个作用应该是避免产生僵尸进程,通过fork两次的方式,刻意杀掉其父进程,使之成为守护进程。

3.僵尸进程清除的方法

1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。

SIGCHLD信号:子进程结束时, 父进程会收到这个信号。如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。

2. kill -18 PPID (PPID是其父进程)

这个信号是告诉父进程,该子进程已经死亡了,请收回分配给他的资源。

SIGCONT也是一个有意思的信号。如前所述,当进程停止的时候,这个信号用来告诉进程恢复运行。该信号的有趣的地方在于:它不能被忽略或阻塞,但可以被捕获。缺省行为是丢弃该信号。

3.终止父进程

如果方法2不能终止,可采用终止其父进程的方法(如果其父进程不需要的话)父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

先看其父进程又无其他子进程,如果有,可能需要先kill其他子进程,也就是兄弟进程。方法是:

kill —15 PID1 PID2 (PID1,PID2是僵尸进程的父进程的其它子进程)。

然后再kill父进程:kill —15 PPID

这样僵尸进程就可能被完全杀掉了。

4:杀死僵尸进程的shell脚本

点击(此处)折叠或打开

#!/bin/bash

# Zombie processes killing script.

# Must be run under root.

case "$1" in

--admin)

stat=`ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print"pid: "$3" *** parent_pid: "$4" *** status: "$10" *** process: "$13}' | grep ": Z"`

if ((${#stat} > 0));then

echo zombie processes found:

echo .

ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print"pid: "$3" *** parent_pid: "$4" *** status: "$10" *** process: "$13}' | grep ": Z"

echo -n "Kill zombies? [y/n]: "

read keyb

if [ $keyb == 'y' ];then

echo killing zombies..

ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print$4" status:"$10}' | grep "status:Z" | awk '{print $1}' | xargs -n 1 kill -9

fi

else

echo no zombies found!

fi

;;

--cron)

stat=`ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print"pid: "$3" *** parent_pid: "$4" *** status: "$10" *** process: "$13}' | grep ": Z"`

if ((${#stat} > 0));then

ps ax | awk '{print $1}' | grep -v "PID" | xargs -n 1 ps lOp | grep -v "UID" | awk '{print$4" status:"$10}' | grep "status:Z" | awk '{print $1}' | xargs -n 1 kill -9

echo `date`": killed some zombie proceses!" >> /var/log/zombies.log

fi

;;

*) echo 'usage: zombies {--cron|--admin}'

;;

esac

linux孤儿进程组深入理解,LInux下僵尸进程与孤儿进程是如何产生的?相关推荐

  1. linux孤儿进程组深入理解,unix基础---有关于孤儿进程组和终端会话的理解-------值得一看!!!...

    转载自http://xingyunbaijunwei.blog.163.com/blog/static/765380672011112633634628/ 孤儿进程: 即一个其父进程已经终止的进程.  ...

  2. Linux/Centos7系统管理之深入理解Linux文件系统与日志分析

    前言:inode(文件节点)与block(数据块)硬链接与软连接恢复误删除的文件 (即rm-rf 的操作,可以先进行备份的操作,然后可以进行恢复ext4和xfs文件系统皆可)日志文件的分类用户日志与程 ...

  3. 在linux中关于组的命令,linux 用户和组管理相关的命令

    linux 用户和组管理相关的命令 用户管理 useradd建立用户帐号 语 法:useradd [options] LOGIN 参 数:-u UID: [UID_MIN, UID_MAX]定义在/e ...

  4. 进程组、session、前台任务、后台任务、守护进程

    进程组 进程组是一组进程的集合,每个进程都属于一个进程组,每个进程组有一个进程组leader进程,进程组的ID(PGID)等于leader进程的ID.对大部分进程来说,它自己就是进程组的leader, ...

  5. linux sleep函数精度,深入理解linux下的短延迟:nanosleep,sleep

    最近在使用nanosleep的时候又踩坑了.于是整理下linux短延迟的用法. 用法 回顾下秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒) 1s = 1000ms = 1000 * ...

  6. linux用户删组,如何在 Linux 下删除用户组(groupdel 命令)

    在 Linux 下,用户组用来组织和管理用户账户.用户组的目的主要是为了定义一系列权限,例如:针对一个资源的读,写,执行,并且将这些权限在用户组的用户之间共享. 一个新的用户组可以通过groupadd ...

  7. linux用户群组实验总结,linux基础概念和个人笔记总结(2)——账号和权限管理实验验证...

    特此感谢! 教员:张仁珑 班主任:傅春华 我想给予他们最崇高的敬意 防伪码:滴水之恩,涌泉相报 感想:当我今天在首页上看到了自己发的文章,这是我的第九篇文档,觉得心里特别开心,也真正理解了 " ...

  8. 【Linux网络编程】深入理解Linux五种网络IO模型

    相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分别是什么含义. ...

  9. linux cpu load 详解,理解linux cpu load - 什么时候应该担心了

    load average: 0.09, 0.05, 0.01 1 大多数人对这些数都有一个模糊的概念:三个数分别代表了一个随着更长时间上的一个平均值(1分钟, 5分钟, 15分钟). 并且值越小越好. ...

最新文章

  1. 恕我直言,IDEA 的 Debug 调试,你可能只用了 10%
  2. 读《高效程序员的45个习惯——敏捷开发修炼之道》
  3. xml publisher 笔记
  4. 推荐系统笔记(近邻推荐)
  5. oracle sql developer sid,登录 Oracle SQL Developer
  6. 关于在bootstrap中如何做垂直排列的tab切换效果
  7. 开发利器之IntelliJ IDEA学习笔记
  8. wget 和scp对比_curl与wget区别
  9. 通用计算机dsp采用,一种基于FPGA+DSP的通用飞控计算机平台设计
  10. Vc2013实战(1) 别无选择的Mfc
  11. 最全Pycharm教程(5)——Python快捷键相关设置
  12. dsp2812 pmsm foc之EVB初始化详解
  13. Scrum和TFS2010
  14. 天地不仁,以万物为刍狗!
  15. Vmware workstation 16pro解锁装MacOS
  16. Nuke对图片添加Alpha通道
  17. php接入阿里云OOS
  18. T1 mapping的用途
  19. 过来人告诉你,去工作前最好还是学学Git
  20. 书论49 蔡襄《论书》

热门文章

  1. pythoncanny边缘检测自适应阈值_基于python实现自适应阈值的canny边缘检测
  2. wireshark ARP抓包
  3. 计算机专业考研390分是什么水平,考研初试390分被淘汰,复试到底发生了什么?...
  4. 百度SEO发包快排解密
  5. 20年上海站D题Walker(二分,简洁)
  6. 灵遁者诗歌集《很白很白的云》序言内容
  7. 开启及清除NV_RESTORE信息的方法
  8. 带上紧箍咒,特斯拉辅助驾驶系统即将更新
  9. 关于学习时,如何处理专业术语的见解
  10. android网络扫描工具,fing网络扫描仪安卓版