linux孤儿进程组深入理解,LInux下僵尸进程与孤儿进程是如何产生的?
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下僵尸进程与孤儿进程是如何产生的?相关推荐
- linux孤儿进程组深入理解,unix基础---有关于孤儿进程组和终端会话的理解-------值得一看!!!...
转载自http://xingyunbaijunwei.blog.163.com/blog/static/765380672011112633634628/ 孤儿进程: 即一个其父进程已经终止的进程. ...
- Linux/Centos7系统管理之深入理解Linux文件系统与日志分析
前言:inode(文件节点)与block(数据块)硬链接与软连接恢复误删除的文件 (即rm-rf 的操作,可以先进行备份的操作,然后可以进行恢复ext4和xfs文件系统皆可)日志文件的分类用户日志与程 ...
- 在linux中关于组的命令,linux 用户和组管理相关的命令
linux 用户和组管理相关的命令 用户管理 useradd建立用户帐号 语 法:useradd [options] LOGIN 参 数:-u UID: [UID_MIN, UID_MAX]定义在/e ...
- 进程组、session、前台任务、后台任务、守护进程
进程组 进程组是一组进程的集合,每个进程都属于一个进程组,每个进程组有一个进程组leader进程,进程组的ID(PGID)等于leader进程的ID.对大部分进程来说,它自己就是进程组的leader, ...
- linux sleep函数精度,深入理解linux下的短延迟:nanosleep,sleep
最近在使用nanosleep的时候又踩坑了.于是整理下linux短延迟的用法. 用法 回顾下秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒) 1s = 1000ms = 1000 * ...
- linux用户删组,如何在 Linux 下删除用户组(groupdel 命令)
在 Linux 下,用户组用来组织和管理用户账户.用户组的目的主要是为了定义一系列权限,例如:针对一个资源的读,写,执行,并且将这些权限在用户组的用户之间共享. 一个新的用户组可以通过groupadd ...
- linux用户群组实验总结,linux基础概念和个人笔记总结(2)——账号和权限管理实验验证...
特此感谢! 教员:张仁珑 班主任:傅春华 我想给予他们最崇高的敬意 防伪码:滴水之恩,涌泉相报 感想:当我今天在首页上看到了自己发的文章,这是我的第九篇文档,觉得心里特别开心,也真正理解了 " ...
- 【Linux网络编程】深入理解Linux五种网络IO模型
相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分别是什么含义. ...
- linux cpu load 详解,理解linux cpu load - 什么时候应该担心了
load average: 0.09, 0.05, 0.01 1 大多数人对这些数都有一个模糊的概念:三个数分别代表了一个随着更长时间上的一个平均值(1分钟, 5分钟, 15分钟). 并且值越小越好. ...
最新文章
- 恕我直言,IDEA 的 Debug 调试,你可能只用了 10%
- 读《高效程序员的45个习惯——敏捷开发修炼之道》
- xml publisher 笔记
- 推荐系统笔记(近邻推荐)
- oracle sql developer sid,登录 Oracle SQL Developer
- 关于在bootstrap中如何做垂直排列的tab切换效果
- 开发利器之IntelliJ IDEA学习笔记
- wget 和scp对比_curl与wget区别
- 通用计算机dsp采用,一种基于FPGA+DSP的通用飞控计算机平台设计
- Vc2013实战(1) 别无选择的Mfc
- 最全Pycharm教程(5)——Python快捷键相关设置
- dsp2812 pmsm foc之EVB初始化详解
- Scrum和TFS2010
- 天地不仁,以万物为刍狗!
- Vmware workstation 16pro解锁装MacOS
- Nuke对图片添加Alpha通道
- php接入阿里云OOS
- T1 mapping的用途
- 过来人告诉你,去工作前最好还是学学Git
- 书论49 蔡襄《论书》