要杀死僵尸进程,您必须从进程列表中删除它的名称。这是一个与Unix时代一样古老的故事。自从C和Unix,以及(后来的)Linux,我们就有了“僵尸”。具体来说,有标记为“僵尸进程”的进程。有些人误解它,有些人忽略它,它对我们“杀死”这些进程的许多努力都免疫,收效甚微。为什么是这样?Linux中的进程是什么?这一切都始于Linux中一个程序的执行,当它被执行时,它的运行实例被称为进程。您可以使用ps命令查看Linux环境中的所有进程:$ps-axPIDTTYSTATTIMECOMMAND1?Ss0:01/usr/lib/systemd/systemdrhgb--switched-root--sys2?S0:00[kthreadd]3?我<0:00[rcu_gp]4?I<0:00[rcu_par_gp]有时一个进程启动另一个进程,使第一个进程成为第二个进程的父进程。pstree命令是一个很棒的工具,它允许您查看系统中进程的“家族树”:$pstree-psnsystemd(1)─┬─systemd-journal(952)├─systemd-udevd(963)├─systemd-oomd(1137)├─systemd-resolve(1138)├─systemd-userdbd(1139)─┬─systemd-userwor(12707)│├─systemd-userwor(12714)│└─systemd-userwor(12715)├─auditd(1140)────{auditd}(1141)├──dbus-broker-lau(1164)────dbus-broker(1165)├─avahi-daemon(1166)────avahi-daemon(1196)├─bluetoothd(1167)每个进程都会在系统中分配一个编号。进程号(PID)1分配给启动期间执行的第一个进程,PID1之后的每个进程都是其后代。PID1进程是初始化进程,在大多数较新版本的Linux中,它只是指向systemd程序的符号链接。使用kill命令结束进程您可以使用kill命令终止Linux系统中的进程。尽管名称为“kill”,kill命令和其他一些命令(例如pkill和killall)被编写/设计为向一个或多个进程发送信号。当没有指定信号时,它发送的默认信号是SIGTERM信号,以终止进程。当一个父进程死亡或被杀死,而它的子进程没有跟随其父进程死亡时,我们称这个进程为“孤儿进程”。如何杀死僵尸进程另一方面,不能“杀死”僵尸进程!你可能会问为什么?因为他们已经死了!每个子进程在终止时都变成僵尸进程,然后被父进程删除。当一个进程退出并释放它所使用的资源时,它的名字保留在操作系统的进程表中。此时,父进程的工作是从进程表中删除它的名称。如果不删除,我们就有了一个僵尸进程,它不再是一个真正的进程,而只是操作系统进程表上的一个条目。这就是为什么即使使用-9(SIGKILL)选项,试图“杀死”一个失效的(僵尸)进程也不起作用,因为没有什么可杀死的。因此,要杀死僵尸进程,即从进程列表(进程表)中删除其名称,您必须杀死其父进程。例如PID5878是一个僵尸进程,它的父进程是PID4809,那么要杀死僵尸进程(5878),就必须结束父进程(4809):$sudokill-94809#4809是父进程,NotZombies我对僵尸的最后警告:杀死父进程时要非常小心。如果一个父进程的PID为1,你杀死它,你自己重新启动!那将是一个更可怕的故事!
