Linux僵尸进程详细解析 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进 程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进 程。
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
怎样产生僵尸进程的:
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程
是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退
出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信
号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动
会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
怎么查看僵尸进程:
利用命令ps,可以看到有标记为Z的进程就是僵尸进程。
怎样来清除僵尸进程:
1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略, 如果想响应这个消息,可以设置一个处理函数。
2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
===========================================
在Linux中可以用
ps auwx
发现僵尸进程
a all w/ tty, including other users 所有窗口和终端,包括其他用户的进程
u user-oriented 面向用户(用户友好)
-w,w wide output 宽格式输出
x processes w/o controlling ttys
在僵尸进程后面 会标注
ps axf
看进程树,以树形方式现实进程列表
ps axm
会把线程列出来,在linux下进程和线程是统一的,是轻量级进程的两种方式。
ps axu
显示进程的详细状态
===========================================
killall
kill -15
kill -9
一般都不能杀掉 defunct进程
用了kill -15,kill -9以后 之后反而会多出更多的僵尸进程
kill -kill pid
fuser -k pid
可以考虑杀死他的parent process,
kill -9 他的parent process
=========================================== 一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程(Zombie Process)。
避免zombie的方法:
1)在SVR4中,如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。另外,使用SVR4版的sigaction,则可设置SA_NOCLDWAIT标志以避免子进程僵死。
Linux中也可使用这个,在一个程序的开始调用这个函数
signal(SIGCHLD,SIG_IGN);
2)调用fork两次。程序8 - 5 实现了这一点。
3)用waitpid等待子进程返回.
===========================================
zombie进程是僵死进程。防止它的办法,一是用wait,waitpid之类的函数获得
进程的终止状态,以释放资源。另一个是fork两次
===========================================
defunct进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的process个数的限制已经快超过了,zombie进程不会有更多的坏处。
可能唯一的方法就是reboot系统可以消除zombie进程。
===========================================
任何程序都有僵尸状态,它占用一点内存资源(也就是进程表里还有一个记录),仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的
fork与zombie/defunct"
在Unix下的一些进程的运作方式。当一个进程死亡时,它并不是完全的消失了。进程终止,它不再运行,但是还有一些残留的小东西等待父进程收回。这些残留 的东西包括子进程的返回值和其他的一些东西。当父进程 fork()一个子进程后,它必须用 wait() 或者 waitpid() 等待子进程退出。正是这个 wait() 动作来让子进程的残留物消失。
自然的,在上述规则之外有个例外:父进程可以忽略 SIGCLD 软中断而不必要 wait()。可以这样做到(在支持它的系统上,比如Linux):
main()
{
signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */
.
.
fork();
fork();
fork(); /* Rabbits, rabbits, rabbits! */
}
现在,子进程死亡时父进程没有 wait(),通常用 ps 可以看到它被显示为“”。它将永远保持这样 直到 父进程 wait(),或者按以下方法处理。
这里是你必须知道的另一个规则:当父进程在它wait()子进程之前死亡了(假定它没有忽略 SIGCLD),子进程将把 init(pid1)进程作为它的父进程。如果子进程工作得很好并能够控制,这并不是问题。但如果子进程已经是defunct,我们就有了一点小麻烦。 看,原先的父进程不可能再 wait(),因为它已经消亡了。这样,init 怎么知道 wait() 这些zombie 进程。
答案:不可预料的。在一些系统上,init周期性的破坏掉它所有的defunct进程。在另外一些系统中,它干脆拒绝成为任何defunct进程的父进 程,而是马上毁灭它们。如果你使用上述系统的一种,可以写一个简单的循环,用属于init的defunct进程填满进程表。这大概不会令你的系统管理员很 高兴吧?
你的任务:确定你的父进程不要忽略 SIGCLD,也不要 wait() 它 fork() 的所有进程。不过,你也未必 要总是这样做(比如,你要起一个 daemon 或是别的什么东西),但是你必须小心编程,如果你是一个 fork()的新手。另外,也不要在心理上有任何束缚。
总结:
子进程成为 defunct 直到父进程 wait(),除非父进程忽略了 SIGCLD 。
更进一步,父进程没有 wait() 就消亡(仍假设父进程没有忽略 SIGCLD )的子进程(活动的或者 defunct)成为 init 的子进程,init 用重手法处理它们。
Linux zombie进程详细解析
时间: 2024-10-27 22:16:18
Linux zombie进程详细解析的相关文章
Linux的SUID SGID解析
一.UNIX下关于文件权限的表示方法和解析 SUID 是 Set User ID, SGID 是 Set Group ID的意思. UNIX下可以用ls -l 命令来看到文件的权限.用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x .下面解析一下格式所表示的意思.这种表示方法一共有十位: 9 8 7 6 5 4 3 2 1 0 - r w x r - x r - x 第9位表示文件类型,可以为p.d.l.s.c.b和-: p表示命名管道文件 d表示目录文件 l表示符号连接文件 -
Linux查看进程命令和具体操作
ps ax 命令显示一个当前系统进程的列表,该列表中包括其他用户拥有的进程.要显示进程以及它们的所有者,使用 ps aux 命令.该列表是一个静态列表:换一句话说,它是在你启用这项命令时正在运行的进程的快照.如果你需要Linux查看进程一个时刻更新的运行进程列表,使用下面描述的 top 命令. Linux查看进程ps 的输出会很长.要防止它快速从屏幕中滑过,你可以把它管道输出给 less 命令: ps aux | less 你可以使用 Linux查看进程ps 命令和 grep 命令的组合来查看某
JSP开发的安全编程实例详细解析
js|安全|编程 Java Server Page(JSP)作为建立动态网页的技术正在不断升温.JSP和ASP.PHP.工作机制不太一样.一般说来,JSP页面在执行时是编译式,而不是解释式的.首次调用JSP文件其实是执行一个编译为Servlet的过程. 当浏览器向服务器请求这一个JSP文件的时候,服务器将检查自上次编译后JSP文件是否有改变,如果没有改变,就直接执行Servlet,而不用再重新编译,这样,效率便得到了明显提高. 今天我将和大家一起从脚本编程的角度看JSP的安全,那些诸如源码暴露类
linux上面进程自动关闭
问题描述 linux上面进程自动关闭 linux下面放了文件解析的进程,有一次数据文件格式出现了错误(路径下有正确格式的文件,也有错误格式的文件).碰到错误的数据文件的时候,进程会自动关闭,这是为什么?能不能设置为碰到错误格式的文件,自动跳过? 解决方案 进程异常了,处理错误文件格式的时候,程序加一些判断等,跳过 解决方案二: 查一下导致错误发生的信号,使用singal忽略此信号 解决方案三: 你要只要进程关闭的原因是什么呀?比如在解析文件格式的时候,段错误了,那肯定就是退出了.
Linux Zombie进程状态介绍 以及 如何清理
Linux 进程有哪些状态 通过ps的帮助手册,能看到进程有几种状态 man ps D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped, either by a job control signal or because it is being traced W pag
以fourinone为例详细解析分布式协调的设计原理
fourinone 实际上可以单独当做 Zookeeper 用,它使用最少的代码实现了 Zookeeper 的所有功能,并且力图做到功能更强但是使用更简洁.本文以 fourinone 为例详细解析了分布式协调的设计原理. Fourinone(中文名字"四不像")是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架.当我们把复杂的 Hadoop 当作一门学科学习时,似乎忘记了我们想解决问题的初衷:我们仅仅是想写个程序把几台甚至更多的机
4种后门技术知识的详细解析
以下的文章主要是介绍4种后门技术知识的讲解,曾经饱受木马.后门(以下统称后门)侵害的人们都不会忘记机器被破坏后的惨不忍睹的状况,于是人们展开了积极的防御工作,从补丁到防火墙,恨不得连网线都加个验证器,在多种多样的防御手法夹攻下.....一大批后门倒下了,菜鸟们也不用提心吊胆上网了-- 可是后门会因此罢休吗?答案当然是否定的.君不见,在风平浪静的陆地下,一批新的后门正在暗渡陈仓--1.反客为主的入侵者黑客A连接上了网络,却不见他有任何行动,他在干什么呢?我们只能看见他燃起一支烟,似乎在发呆--过了
Photoshop详细解析古风人像的摄影和后期过程
本教程主要使用Photoshop详细解析古风人像的摄影和后期过程,拍摄古风作品前,我们首先要了解什么是古风.我理解的古风为"具有古代韵味气息的文化及作品",所以在拍摄前后均围绕"古代韵味"做文章.既然构思的是清妆古韵,那在后期处理上自然就选择了偏冷的色调. 一.拍摄部分 1.场景 原计划是去青城山,因为当天拍摄时间有限,最后选择在市区内的望江公园,这个场地很多摄影师都去拍过,为了避免重复,我们没有去标志性的建筑拍摄,或者说有意避开了"热门"拍
linux内核 进程地址空间
问题描述 linux内核 进程地址空间 大神: 我是一个Linux内核菜鸟,在<<深入linux内核架构>>一书中写道:"各个进程的地址空间都是独立的", ,大神, 我不理解进程的"地址空间"是什么, 是进程的内存吗,请赐教,不胜感激涕零. 解决方案 进程启动后,都有一块自己的私人空间,其它进程 不可以直接访问的 .基本上所有操作系统都是这样的,这是最基本的安全性.这里所说的地址空间 就是一系列的内存地址罢了. 解决方案二: 内容是从<