数据结构 - Linux中的僵尸进程和孤儿进程
Linux僵尸进程怎么杀?在Linux中有一些有些程序即使执行完了任务,还是会留在进程中,此为僵尸进程,留下没有任何作用,还会持续消耗硬件资源,虽然该进程是无害的,但一直存储在内存中的也是一个问题。
什么是僵尸进程
进程的工作原理:启动一个程序开始任务,然后等任务结束了停止这个进程。进程停止后,该进程就会从进程表中移除。
通过 System-Monitor 查看当前进程。
但是,有时候有些程序即使执行完了也依然留在进程表中。我们称之为 “僵尸进程”。
当子进程比父进程先结束,而父进程又没有回收子进程并且释放子进程占用的资源【父进程没有等待(调用wait / waitpid)子进程】,此时子进程将成为一个僵尸进程。
什么是孤儿进程
如果父进程先退出,而它的一个或多个子进程还在运行,这些子进程将成为孤儿进程,子进程被init进程(进程号为1)接管【由init进程来接管成为父进程】,子进程退出后init进程会回收其占用的相关资源。
僵尸进程如何产生
当运行一个程序时,它会产生一个父进程、很多子进程,所有这些子进程都会消耗内核分配给它们的内存和 CPU 资源。
这些子进程完成执行后会发送一个 Exit 信号然后死掉,这个 Exit 信号需要被父进程所读取。父进程需要随后调用 wait 命令来读取子进程的退出状态,并将子进程从进程表中移除。
若父进程正确第读取了子进程的 Exit 信号,则子进程会从进程表中删掉。
但若父进程未能读取到子进程的 Exit 信号,则这个子进程虽然完成执行处于死亡的状态,但也不会从进程表中删掉。
僵尸进程对系统有害吗
不会。由于僵尸进程并不做任何事情,不会使用任何资源也不会影响其它进程,因此存在僵尸进程也没什么坏处。不过由于进程表中的退出状态以及其它一些进程信息也是存储在内存中的,因此存在太多僵尸进程有时也会是一些问题。
你可以想象成这样:
“你是一家建筑公司的老板。你每天根据工人们的工作量来支付工资。有一个工人每天来到施工现场,就坐在那里,你不用付钱,他也不做任何工作。 他只是每天都来然后呆坐在那,仅此而已!”
这个工人就是僵尸进程的一个活生生的例子。但是,如果你有很多僵尸工人,你的建设工地就会很拥堵从而让那些正常的工人难以工作。
如何找出僵尸进程
打开终端并输入下面命令:
ps aux | grep Z
会列出进程表中所有僵尸进程的详细内容。
僵尸进程怎么杀
正常情况下我们可以用 SIGKILL 信号来杀死进程,但是僵尸进程已经死了,你不能杀死已经死掉的东西。
因此你需要输入的命令应该是
kill -s SIGCHLD pid // pid 为父进程的进程id
将这里的 pid 替换成父进程的进程 id,这样父进程就会删除所有以及完成并死掉的子进程了。
你可以把它想象成:
“你在道路中间发现一辆废弃的汽车,于是你联系了拖车,之后拖车就会将这辆废弃的汽车带离道路。”
如果程序本身编写的不是很好,是无法删掉这些子进程的(否则你一开始也见不到这些僵尸了)。
因此想要快速删除子进程,只有结束TA们的父进程即可。
如何预防僵尸进程
1、在父进程创建子进程之前,就向系统申明自己并不会对这个子进程的exit动作进行任何关注行为,此时子进程一旦退出后,系统就不会去等待父进程的操作,而是直接将该子进程的资源回收掉,也就不会出现僵尸进程了。具体的办法就是,在父进程的初始化函数中,调用这个函数:signal(SIGCHLD,SIG_IGN);【SIGCHLD 子线程终止或暂停 ;SIG_IGN 忽视信号 总体含义是:父进程不关心子进程啥时候要退出,内核可在子进程退出后自行销毁残余的资源】
2、如果上述语句没来得及调用,也有另外一个办法:在创建完子进程后,用waitpid等待子进程返回,也能达到上述效果;
3、如果上述两个办法都不愿意采用,那还有一招:在父进程A1创建子进程A2时,连续调用两次fork()【A1 创建 A2 ,A2 创建 A3】,而且使紧跟的子进程A2直接退出,使其孙子进程A3成为孤儿进程,从而init进程将代替孙子进程A3的父进程A2来接手,负责清除这个孤儿进程。于是,父进程就无需进行任何的清理行为,系统会自动处理。【父进程A1一次fork()后产生一个子进程A2随后立即执行waitpid(子进程pid, NULL, 0)来等待子进程A2结束,然后子进程A2fork()后产生孙子进程A3随后立即exit(0),这样子进程A2顺利终止(A1父进程仅仅给子进程A2收尸,并不需要子进程A2的返回值),然后A1父进程继续执行。这时的孙子进程A3由于失去了它的父进程A2(即是父进程A1的子进程A2)成为孤儿进程A3,将被转交给Init进程托管。于是父进程A1与孙子进程A3无继承关系了,它们的父进程均为Init进程,Init进程在其子进程结束时会自动收尸,这样也就不会产生僵尸进程了。】
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析