什么是进程,为什么它没有被杀死?

什么是进程,为什么它没有被杀死?

Chrome 浏览器没有响应,我试图杀死它,但是<defunct>它右边的进程不但没有消失,反而没有被杀死:

在此处输入图片描述

什么是<defunct>进程以及为什么它不会被终止?

答案1

从您的输出中,我们看到“defunct”,这意味着该进程已完成其任务或已损坏或被终止,但其子进程仍在运行或这些父进程正在监视其子进程。要终止此类进程,kill -9 PID 不起作用。您可以尝试使用此命令终止它们,但它会一次又一次地显示此信息。

确定此已停用进程的父进程并将其终止。要了解这一点,请运行以下命令:

$ ps -ef | grep defunct
    UID          PID     PPID       C    STIME      TTY          TIME              CMD
    1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
    1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

然后kill -9 637 27872,验证已停止的进程是否已经消失ps -ef | grep defunct

答案2

手册页 ps(1) 说

标记的流程<defunct>是死进程(所谓的“僵尸”) 会因为父进程没有正确销毁而保留下来。init(8)如果父进程退出,这些进程也会被销毁。

你无法杀死它,因为它已经死了。唯一剩下的就是进程表中的一个条目

在 Unix 和类 Unix 计算机操作系统中,僵尸进程或已停用进程是已完成执行但仍在进程表中有条目的进程。仍然需要此条目来允许父进程读取其子进程的退出状态。

除非有很多这样的进程,否则让它们继续存在也没什么坏处。僵尸进程最终会被其父进程收割(通过调用wait(2))。如果原始父进程在退出之前没有收获它,那么init进程(pid == 1)会在稍后的某个时间进行收获。僵尸进程只是:

已终止且在其退出状态被报告给正在等待该进程终止的另一个进程时被删除的进程。

答案3

扩展帕丁顿的回答......

从你的输出中我们看到已不复存在,这意味着孩子进程要么已完成其任务,要么已损坏或被终止。其父进程仍在运行,并且尚未注意到其子进程已终止。

kill -9 PID不起作用(已经死了)。

要确定该子进程的父进程,请运行以下命令:

ps -ef | grep defunct

 UID  PID **PPID** C STIME TTY TIME     CMD
 1000 637  27872   0 Oct12 ?   00:00:04 [chrome] <defunct>

查看父母是谁:ps ax | grep 27872

如果你愿意,你可以杀死父母,然后已不存在的父母就会消失。 kill -9 27872

请参阅 Jfs 的回答以了解更技术性的推理。

答案4

除了@Paddington的答案之外,我还将此功能添加到我的bashrc中以便快速检查:

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

它输出类似这样的内容:

孩子们:
UID PID PPID C STIME TTY 时间 CMD
用户 25707 25697 0 Feb26 pts/0 00:00:00 [sh]
用户 30381 29915 0 11:46 pts/7 00:00:00 grep defunct
------------------------------
父母:
25697 点/0 00:00:00 npm

相关内容