如何清理僵尸进程(转载)

如何清理僵尸进程(转载),第1张

首先说说:僵尸进程是什么?

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。

我们都知道进程的工作原理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。进程停止后, 该进程就会从进程表中移除。

僵尸进程啥危害?

由于子进程的结束和父进程的运行是一个不同过程,父进程无法判断子进程什么时候结束. 或者说不知道 子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNⅨ提供可用机制,这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程释放. 但这样就导致了问题,如果进程不更新掉,那么保留的那段信息就不会释放,其进程号就会一直被占用,系统进程号有限,如果大量的产生僵尸进程,可能因为进程太多占用无法产生新的进程,这应该避免。

1、那么如何查看僵尸进程呢?

如何查看 linux 系统上的僵尸进程,或者如何统计有多少僵尸进程?

命令:ps -ef | grep defunct

或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思,使用top命令查看,如果状态为Z也就是(zombie process)说明它就是僵尸进程。

Tasks: 85 total, 2 running, 82 sleeping, 0 stopped, 0 zombie

top命令也可以查看。或者使用下面的命令:

ps -ef | grep defunct | grep -v grep | wc -l

2、如何杀死僵尸进程?

一般僵尸进程很难直接kill掉,不过您可以kill父进程(僵尸父亲),“父亲”死后,僵尸进程成为”孤儿进程”,接着给init它始终会负责清理僵尸进程.紧随着父亲消失了,儿子也就跟着消失了。

ps -e -o ppid,stat | grep Z | cut –d” ” -f2 | xargs kill -9

kill -HUP ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’

当然了,如果您精通其他语言的话,当真是简单方便

3、如何避免僵尸进程?

对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结 束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的 *** 作设为SIG_IGN。

signal(SIGCHLD,SIG_IGN)

用两次fork()参数,而且使紧跟的子进程直接退出,让孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程

电脑中了僵尸病毒解决方法:

1、如果杀毒软件提示有病毒入侵,一定要立刻开启查杀,如果闪电查杀顺利解决掉病毒就最好,如果不行,就改为全盘查杀;

2、全盘查杀时间相对较长,可能查过两三个小时,这个时候一定要看看感染电脑的病毒类型,如果是感染性/病毒,建议不要查杀了,等查杀完整个硬盘就全感染了;

3、如果刚感染不久,最好的解决方法是立刻重装系统。

计算机僵尸病毒(Computer Virus)被明确定义,病毒指“编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码”。

与医学上的“病毒”不同,计算机僵尸病毒不是天然存在的,是某些人利用计算机软件和硬件所固有的脆弱性编制的一组指令集或程序代码。

它能通过某种途径潜伏在计算机的存储介质(或程序)里,当达到某种条件时即被激活,通过修改其他程序的方法将自己的精确拷贝或者可能演化的形式放入其他程序中,从而感染其他程序,对计算机资源进行破坏,所谓的病毒就是人为造成的,对其他用户的危害性很大!

在了解僵尸进程之前,让我们来复习一下什么是 Linux 进程。

简而言之, 进程 [1] 是一个程序的运行实例。它可能运行在前端(比如有交互的进程),也可能运行在后端(比如无交互或自动运行的进程)。它可能是一个父进程(运行期间创建了其他进程),也可能是一个子进程(由其他进程所创建)。

在 Linux 系统中,除 PID 为 0 的第一个 init 进程(或 systemd )外,其余进程都有父进程。进程也可以拥有自己的子进程。

不相信?可以试试在终端中使用 pstree 命令查看进程的树型结构,你能看到系统各个进程的“家族树”。

子进程死亡后,它的父进程会接收到通知去执行一些清理 *** 作,如释放内存之类。然而,若父进程并未察觉到子进程死亡,子进程就会进入到“<ruby style="box-sizing: border-box">僵尸<rt style="box-sizing: border-box">zombie</rt></ruby>”状态。从父进程角度看,子进程仍然存在,即使子进程实际上已经死亡。这就是“<ruby style="box-sizing: border-box">僵尸进程<rt style="box-sizing: border-box">zombie process</rt></ruby>”(也被称为“<ruby style="box-sizing: border-box">已消失进程<rt style="box-sizing: border-box">defunct process</rt></ruby>”)是如何产生并存在于系统中的。

这里有一个来自 Turnoff.us [2] 的关于僵尸进程的非常有趣的看法:

Image credit: Turnoff.us

重点要说的是,僵尸进程并没有像它的名称那样看起来可怕。

但如果系统的内存已经所剩不多或者有太多的僵尸进程在吃掉内存,问题会变得糟糕。同样,大部分 Linux 系统进程最大 PID 设置为 32768,如果过多僵尸进程导致其他重要任务没有 PID 可用,你的系统会发生崩溃。

这是真实可能发生的,它有一定的概率,特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候。

在这种情况下,找到并杀死僵尸进程是一个明智的做法。

Linux 系统中的进程可能处于如下状态中的一种:

那如何查看进程和它的当前状态呢?一个简单的方法是在终端中使用 top 命令 [3]。

Top command show processes and their status

正如你在上面截图中看到的,截图中共有 250 个任务(进程),其中 1 个处在 “<ruby style="box-sizing: border-box">运行中<rt style="box-sizing: border-box">running</rt></ruby>” 状态,248 个进程处于 “<ruby style="box-sizing: border-box">休眠<rt style="box-sizing: border-box">sleep</rt></ruby>” 状态,还有一个处于 “<ruby style="box-sizing: border-box">僵尸<rt style="box-sizing: border-box">zombie</rt></ruby>” 状态。

现在问题进入下一步,如何杀死 “僵尸” 进程?

僵尸进程已经死了,要如何才能杀死一个已经死亡的进程呢?

在僵尸电影中,你可以射击僵尸的头部或烧掉它们,但在这里是行不通的。你可以一把火烧了系统来杀死僵尸进程,但这并不是一个可行的方案。

一些人建议发送 SIGCHLD 给父进程,但这个信号很可能会被忽略。还有一个方法是杀死父进程来杀死僵尸进程,这听起来很野蛮,但它却是唯一能确保杀死僵尸进程的方法。

首先,通过在终端中 使用 ps 命令 [4] 我们列举僵尸进程,得到它们的进程 ID:

<pre class="prettyprint linenums" style="box-sizing: border-boxoverflow: hiddenfont: 400 12px / 20px "courier new"display: blockpadding: 10px 15pxmargin: 20px 0pxcolor: rgb(248, 248, 212)word-break: break-alloverflow-wrap: break-wordbackground: rgb(39, 40, 34)border: noneborder-radius: 4pxbox-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px insetletter-spacing: normalorphans: 2text-align: starttext-indent: 0pxtext-transform: nonewidows: 2word-spacing: 0px-webkit-text-stroke-width: 0pxtext-decoration-thickness: initialtext-decoration-style: initialtext-decoration-color: initial">

</pre>

ps ux 命令输出的第 8 列显示了进程状态。上述命令只会打印所有处在 Z+ 状态(表示僵尸状态)的进程。

确认了进程 ID 后,我们可以得到它的父进程 ID:

<pre class="prettyprint linenums" style="box-sizing: border-boxoverflow: hiddenfont: 400 12px / 20px "courier new"display: blockpadding: 10px 15pxmargin: 20px 0pxcolor: rgb(248, 248, 212)word-break: break-alloverflow-wrap: break-wordbackground: rgb(39, 40, 34)border: noneborder-radius: 4pxbox-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px insetletter-spacing: normalorphans: 2text-align: starttext-indent: 0pxtext-transform: nonewidows: 2word-spacing: 0px-webkit-text-stroke-width: 0pxtext-decoration-thickness: initialtext-decoration-style: initialtext-decoration-color: initial">

</pre>

你也可以将上述两个命令结合在一起,直接得到僵尸进程的 PID 及其父进程的 PID:

<pre class="prettyprint linenums" style="box-sizing: border-boxoverflow: hiddenfont: 400 12px / 20px "courier new"display: blockpadding: 10px 15pxmargin: 20px 0pxcolor: rgb(248, 248, 212)word-break: break-alloverflow-wrap: break-wordbackground: rgb(39, 40, 34)border: noneborder-radius: 4pxbox-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px insetletter-spacing: normalorphans: 2text-align: starttext-indent: 0pxtext-transform: nonewidows: 2word-spacing: 0px-webkit-text-stroke-width: 0pxtext-decoration-thickness: initialtext-decoration-style: initialtext-decoration-color: initial">

</pre>

现在你得到了父进程 ID,使用命令行和得到的 ID 号 终于可以杀死进程了 [5]:

<pre class="prettyprint linenums" style="box-sizing: border-boxoverflow: hiddenfont: 400 12px / 20px "courier new"display: blockpadding: 10px 15pxmargin: 20px 0pxcolor: rgb(248, 248, 212)word-break: break-alloverflow-wrap: break-wordbackground: rgb(39, 40, 34)border: noneborder-radius: 4pxbox-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px insetletter-spacing: normalorphans: 2text-align: starttext-indent: 0pxtext-transform: nonewidows: 2word-spacing: 0px-webkit-text-stroke-width: 0pxtext-decoration-thickness: initialtext-decoration-style: initialtext-decoration-color: initial">

</pre>

Killing parent process

再次运行 ps 命令或 top 命令,你可以验证僵尸进程是否已经被杀死。

恭喜!现在你知道怎么清理僵尸进程了。

via: https://itsfoss.com/kill-zombie-process-linux/


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11955343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存