Ped*_*ram 50 process kill zombie
有没有办法在不重启的情况下杀死僵尸进程?事情是这样发生的:
我想使用 torrent 下载一个 12GB 的文件。添加 .torrent 文件后,传输变成了僵尸进程(我也尝试过 ktorrent。相同的行为)。最后我可以使用 µTorrent 下载文件,但在关闭程序后,它也变成了僵尸。
我尝试使用kill,skill并pkill使用不同的选项和-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父进程发送信号来杀死。我认为信号数SIGCHLD是17或18
如果这也失败了,那么您可能想要杀死父级本身。
当子进程在父进程调用 wait 之前终止时,内核会保留有关该进程的一些信息,以便其父进程稍后调用 wait。因为子进程仍在消耗系统资源但不执行它,所以被称为僵尸进程。
编辑 1:消耗的系统资源主要是进程表条目。如果有人知道它是否消耗更多 - 内存或 CPU 周期,那么请添加解释。AFAIK 它几乎不占用任何重要的系统资源。
在 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,没有它您的系统将无法运行
Sim*_*ter 10
使用kill过程本身确实是无效的,因为这个过程是已经死了; kill将实时进程带入僵尸状态。
父进程负责拾取进程的退出码;在完成此操作之前,该过程将保持僵尸状态。该init进程将获取任何进程的退出代码并将其丢弃,因此它是“最后的手段”父进程将清理任何作为直接后代的僵尸。
杀死僵尸进程的父进程通常是有效的,因为init一旦父进程消失,僵尸进程就会恢复为它的父进程(即杀死父进程已将该进程变成僵尸进程,而祖父进程已读取父进程的退出代码,所以父母真的走了)。僵尸可以是僵尸的父级,因此仅仅杀死父级是不够的,还需要由另一个进程自己收集。
请注意,进程从不负责清理他们的孙子进程——它们总是恢复到进程 1 作为父进程(这就是为什么守护进程作者有时使用双 fork() 并在中间终止进程以完全分离子进程与调用贝壳)
杀死wine可能无效的原因是因为它实际上并不是僵尸进程的父进程;相反,作为 init 的直接后代的“utorrent.exe”是。然而这个过程仍然正常运行,只是忽略了它的职责。