有没有办法在不重启的情况下杀死僵尸进程?

Ped*_*ram 50 process kill zombie

有没有办法在不重启的情况下杀死僵尸进程?事情是这样发生的:

我想使用 torrent 下载一个 12GB 的文件。添加 .torrent 文件后,传输变成了僵尸进程(我也尝试过 ktorrent。相同的行为)。最后我可以使用 µTorrent 下载文件,但在关闭程序后,它也变成了僵尸。

我尝试使用kill,skillpkill使用不同的选项和-9信号,但没有成功。

在网上阅读了一些解决方案后,我发现杀死父母可以杀死僵尸。但杀酒也无济于事。

还有其他方法吗?

编辑:

ps -o pid,ppid,stat,comm

PID  PPID STAT COMMAND
7121  2692 Ss   bash
7317  7121 R+   ps
Run Code Online (Sandbox Code Playgroud)

pstree 输出:

init???GoogleTalkPlugi???4*[{GoogleTalkPlug}]
 ??NetworkManager???dhclient
 ?                ??{NetworkManager}
 ??acpid
 ??amarok???19*[{amarok}]
 ??apache2???5*[apache2]
 ??atd
 ??avahi-daemon???avahi-daemon
 ??bonobo-activati???{bonobo-activat}
 ??clock-applet
 ??console-kit-dae???63*[{console-kit-da}]
 ??cron
 ??cupsd
 ??2*[dbus-daemon]
 ??2*[dbus-launch]
 ??desktopcouch-se???desktopcouch-se
 ??firefox???run-mozilla.sh???firefox-bin???plugin-containe???8*[{plugin-contain}]
 ?                                        ??14*[{firefox-bin}]
 ??gconfd-2
 ??gdm-binary???gdm-simple-slav???Xorg
 ?            ?                 ??gdm-session-wor???gnome-session???bluetooth-apple
 ?            ?                 ?                 ?               ??compiz???sh???gtk-window-deco
 ?            ?                 ?                 ?               ??fusion-icon
 ?            ?                 ?                 ?               ??gdu-notificatio
 ?            ?                 ?                 ?               ??gnome-panel???{gnome-panel}
 ?            ?                 ?                 ?               ??gnome-power-man
 ?            ?                 ?                 ?               ??gpg-agent
 ?            ?                 ?                 ?               ??gwibber-service
 ?            ?                 ?                 ?               ??nautilus
 ?            ?                 ?                 ?               ??nm-applet
 ?            ?                 ?                 ?               ??polkit-gnome-au
 ?            ?                 ?                 ?               ??2*[python]
 ?            ?                 ?                 ?               ??qstardict???{qstardict}
 ?            ?                 ?                 ?               ??ssh-agent
 ?            ?                 ?                 ?               ??tracker-applet
 ?            ?                 ?                 ?               ??trackerd
 ?            ?                 ?                 ?               ??wakoopa???wakoopa
 ?            ?                 ?                 ?               ?         ??3*[{wakoopa}]
 ?            ?                 ?                 ?               ??{gnome-session}
 ?            ?                 ?                 ??{gdm-session-wo}
 ?            ?                 ??{gdm-simple-sla}
 ?            ??{gdm-binary}
 ??6*[getty]
 ??gnome-keyring-d???2*[{gnome-keyring-}]
 ??gnome-screensav
 ??gnome-settings-
 ??gnome-system-mo
 ??gnome-terminal???bash???ssh
 ?                ??bash???pstree
 ?                ??gnome-pty-helpe
 ?                ??{gnome-terminal}
 ??gvfs-afc-volume???{gvfs-afc-volum}
 ??gvfs-fuse-daemo???3*[{gvfs-fuse-daem}]
 ??gvfs-gdu-volume
 ??gvfsd
 ??gvfsd-burn
 ??gvfsd-computer
 ??gvfsd-metadata
 ??gvfsd-trash
 ??hald???hald-runner???hald-addon-acpi
 ?      ?             ??hald-addon-cpuf
 ?      ?             ??hald-addon-inpu
 ?      ?             ??hald-addon-stor
 ?      ??{hald}
 ??indicator-apple
 ??indicator-me-se
 ??indicator-sessi
 ??irqbalance
 ??kded4
 ??kdeinit4???kio_http_cache_
 ?          ??klauncher
 ??kglobalaccel
 ??modem-manager
 ??multiload-apple
 ??mysqld???10*[{mysqld}]
 ??named???10*[{named}]
 ??nmbd
 ??notification-ar
 ??notify-osd
 ??polkitd
 ??pulseaudio???gconf-helper
 ?            ??2*[{pulseaudio}]
 ??rsyslogd???2*[{rsyslogd}]
 ??rtkit-daemon???2*[{rtkit-daemon}]
 ??smbd???smbd
 ??snmpd
 ??sshd
 ??timidity
 ??trashapplet
 ??udevd???2*[udevd]
 ??udisks-daemon???udisks-daemon
 ?               ??{udisks-daemon}
 ??upowerd
 ??upstart-udev-br
 ??utorrent.exe???{utorrent.exe}
 ??vnstatd
 ??winbindd???2*[winbindd]
 ??wnck-applet
 ??wpa_supplicant
 ??xinetd
Run Code Online (Sandbox Code Playgroud)

系统监视器和顶部显示僵尸进程正在使用资源:

在此处输入图片说明

在此处输入图片说明

编辑2: 我想我找到了一些东西。我尝试注销并看到此消息:

在此处输入图片说明

由于其他 torrent 客户端也有同样的问题,这可能与文件大小有关。我在 ext4 分区上使用 ubuntu 10.04。杀死 nautilus 并向其发送 SIGCHLD 信号不起作用。

Man*_*nha 44

我不认为僵尸进程很头疼。僵尸进程不占用任何资源。只是它在进程表中有它的条目。

僵尸进程不是孤儿进程,它确实有一个父进程。

kill,skill pkill将无法工作,因为该进程已被终止,只是它的条目尚未删除。

僵尸进程可以通过向SIGCHLD父进程发送信号来杀死。我认为信号数SIGCHLD1718

如果这也失败了,那么您可能想要杀死父级本身。

来自维基百科关于 SIGCHLD 信号:

当子进程在父进程调用 wait 之前终止时,内核会保留有关该进程的一些信息,以便其父进程稍后调用 wait。因为子进程仍在消耗系统资源但不执行它,所以被称为僵尸进程。


编辑 1:消耗的系统资源主要是进程表条目。如果有人知道它是否消耗更多 - 内存或 CPU 周期,那么请添加解释。AFAIK 它几乎不占用任何重要的系统资源。


编辑 2:引自维基百科

在 Unix 和类 Unix 计算机操作系统上,僵尸进程或失效进程是已完成执行但在进程表中仍有条目的进程。仍然需要此条目以允许启动(现在处于僵死状态)进程的进程读取其退出状态。

因此保留条目以便父进程可以知道退出状态,因为在子进程退出的那一刻,父进程可能不在状态或未准备好读取其退出状态。


编辑 3

到目前为止,我从未遇到过占用 CPU 100% 的僵尸进程。第一次看到这个。

尝试做一个 killall utorrent.exe

我可以看到有两个实例,utorrent.exe其中一个是僵尸。可能是第二个(孩子)。killall 应该杀死父母,因为孩子(僵尸)不能被杀死。


编辑 4

看起来 killall 不起作用,因为它给出了 TERM 信号而不是 KILL。

试用 killall --signal=KILL utorrent.exe

如果这不起作用,请尝试有选择地终止进程。

获取utorrent.exe进程PID列表

ps -e | grep -i utorrent

你应该得到两个过程

xxxx ?        aa:bb:cc utorrent.exe defunct
yyyy ?        aa:bb:cc utorrent.exe
Run Code Online (Sandbox Code Playgroud)

所以第二个是父级。杀死它使用

杀死 -9 yyyy

编辑 5

请尝试通过此 bash 命令查找进程的父 ID

cat /proc/{defunctpid}/status | grep -i ppid

你的情况是

cat /proc/7298/status | grep -i ppid

如果输出像

PPid:1

然后可悲的是,我认为你不走运。进程 ID1属于 init,没有它您的系统将无法运行

  • 僵尸进程完全占用了我的一个 CPU 内核。该内核的使用率为 100%。所以它不仅是进程表条目。我将在问题中添加其他信息。 (7认同)
  • 使用 CPU 的僵尸可能正在运行后台线程。尝试使用 `top -H` 在顶部显示线程而不是进程。 (4认同)
  • 您写了“僵尸进程不占用任何资源”并引用“子进程仍在消耗系统资源......它被称为僵尸进程”。 (2认同)
  • 失效进程的主要问题是它们继续使用最终使用的端口。 (2认同)

Sim*_*ter 10

使用kill过程本身确实是无效的,因为这个过程是已经死了; kill将实时进程带入僵尸状态。

父进程负责拾取进程的退出码;在完成此操作之前,该过程将保持僵尸状态。该init进程将获取任何进程的退出代码并将其丢弃,因此它是“最后的手段”父进程将清理任何作为直接后代的僵尸。

杀死僵尸进程的父进程通常是有效的,因为init一旦父进程消失,僵尸进程就会恢复为它的父进程(即杀死父进程已将该进程变成僵尸进程,而祖父进程已读取父进程的退出代码,所以父母真的走了)。僵尸可以是僵尸的父级,因此仅仅杀死父级是不够的,还需要由另一个进程自己收集。

请注意,进程从不负责清理他们的孙子进程——它们总是恢复到进程 1 作为父进程(这就是为什么守护进程作者有时使用双 fork() 并在中间终止进程以完全分离子进程与调用贝壳)

杀死wine可能无效的原因是因为它实际上并不是僵尸进程的父进程;相反,作为 init 的直接后代的“utorrent.exe”是。然而这个过程仍然正常运行,只是忽略了它的职责。