Linux上的万圣节:如何杀死僵尸进程

万圣节邮票

死亡的日子快到了,这就是为什么我们要从LxA做这个小教程来谈论 僵尸进程 以及我们如何杀死他们。 首先要说的是僵尸进程是什么,这就是众所周知的,Linux内核具有一个子系统来管理进程,并与调度程序一起创建,改变优先级,发送或删除CPU处理流程以及杀死进程好吧,内核的这一部分与其他类似Unix的系统一样,可以区分进程的各种状态...

所以我们可以找到 一个过程 它可以处于睡眠(S)状态,即处于睡眠状态。 此外,处于运行状态(R)的进程(当前正在运行或正在运行的进程),正在等待的进程(D)(已停止等待被照顾,打手势(T)或暂停),以及僵尸(Z)或已故。 僵尸进程或死进程是已经成功终止的进程,但是由于Linux仍将其保存在进程表中,因此某些系统资源被劫持了。 您已经知道,当一个进程结束时,它不应该保持这种状态,而应该完成并且内核释放资源,以便其他进程可以使用它们,基本上,它可以释放占用的RAM ...

好吧,虽然这种僵尸进程并不那么频繁,但它并没有那么有趣,我们可以按照此处指示的方法进行搜索并消除它们。 第一件事是查找我们发行版中是否存在僵尸进程,为此我们可以自助 像top或ps之类的工具。 例如,以下两个选项之一:

ps -el | grep 'Z'

ps aux | grep defunct

一旦检测到,我们就可以 杀了他 直接与:

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

尽管另一种选择是找到父进程,但是 杀死僵尸进程 您可能已经推论,必须杀死支持它的父进程:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

您将不得不更换根据找到的僵尸进程的ID并用kill杀死它,请使用父进程的ID替换在这个例子中,很明显。


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责资料:AB Internet Networks 2008 SL
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   做的球

    不错的网站!
    他们总能让我们摆脱困境。

    哪里说:
    虽然另一种选择是找到父进程,因为要杀死僵尸进程,您必须杀死支持它的父进程,正如您可能已经推断出的那样:

    1 | ps -eo pid, ppid | 格雷普
    2|
    3 | 杀 -9

    您必须替换您找到的僵尸进程的 ID 并用 kill 杀死它,显然使用示例中替换的父进程的 ID。

    您可以添加脚本:

    $猫killppid.sh
    #!/斌/庆典
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    当然,这不是一个普通用户一直在执行的任务。
    它只对管理员有用,但以 root 身份运行它是危险的,因为它可以杀死系统上的任何进程。

    在 man kill 它有这样的注释:

    注意 您的 shell(命令行解释器)可能有一个内置的 kill 命令。 你可以
    需要运行这里描述为/bin/kill的命令来解决冲突。

    Bash 有那个命令,这是 man bash 关于它的一部分:

    杀死 [-s sigspec | -n 符号 | -sigspec] [pid | 工作规范] ...
    kill -l | -L [sigspec | 退出状态]
    将sigspec或signum命名的信号发送给pid或job命名的进程
    规格sigspec 是不区分大小写的信号名称,例如 SIGKILL(带有或
    没有 SIG 前缀)或信号编号; signum 是信号编号。 如果
    sigspec 不存在,则假定为 SIGTERM。 -l 的参数列出了
    信号名称。 如果在给出 -l 时提供了任何参数,则
    列出了与参数对应的信号,返回状态为 0。
    -l 的 exit_status 参数是一个数字,指定信号编号或
    由信号终止的进程的退出状态。 -L 选项等效
    借给-l。 如果至少成功发送了一个信号,kill 返回真,或者
    如果发生错误或遇到无效选项,则为 false。

    一开始他们解释了 bash 如何保护进程,以避免一些问题,但我不清楚如何制作一个安全的脚本来以 root 身份运行。
    我唯一能想到的就是像这样保护它:

    $猫killppid.sh
    #!/斌/庆典
    如果 [$ USER == "root"]
    然后 echo 不要以 root 身份运行 $ 0 !!! 有危险!
    出口
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    使用bash的kill,而不是/bin/kill

    你怎么能看出我不太精通 bash。
    你知道如何编写一个以子进程用户身份运行的安全脚本,即使它以 root 身份运行?
    相当于像这样手动完成的事情:

    $苏;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')