当前位置: 首页>>技术问答>>正文


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

, , ,

问题描述

有没有办法在没有重启的情况下杀死僵尸进程?这是怎么回事:

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

我尝试使用killskillpkill以及不同选项和-9信号,但没有成功。

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

还有另一种方式吗?

编辑:

ps -o pid,ppid,stat,comm

PID  PPID STAT COMMAND
7121  2692 Ss   bash
7317  7121 R+   ps

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

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

process,kill,zombie,ubuntu

process,kill,zombie,ubuntu

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

process,kill,zombie,ubuntu

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

最佳解决思路

我不是僵尸程序的事情让人头疼不已。僵尸进程不占用任何资源。只是它在进程表中有它的条目。

Zombie进程不是孤儿进程,它有父进程。

killskill pkill将不起作用,因为该过程已被杀死,只是它的条目尚未被删除。

通过向父母发送SIGCHLD信号可以杀死僵尸进程。我认为SIGCHLD的信号编号是1718

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

From Wikipedia on SIGCHLD signal:

When a child process terminates before the parent has called wait, the kernel retains some information about the process to enable its parent to call wait later. Because the child is still consuming system resources but not executing it is known as a zombie process.


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


EDIT 2: Quoting from Wikipedia

On Unix and Unix-like computer operating systems, a zombie process or defunct process is a process that has completed execution but still has an entry in the process table. This entry is still needed to allow the process that started the (now zombie) process to read its exit status.

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


编辑3

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

尝试做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

所以第二个是父母。用它来杀死它

kill -9 yyyy

编辑5

请尝试通过此bash命令查找进程的Parent Id

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

在你的情况下是

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

如果输出像

PPid: 1

然后遗憾的是我认为你运气不好。进程ID 1属于init,没有它,系统无法运行

次佳解决思路

在过程本身上使用kill确实无效,因为该过程已经死亡; kill为僵尸状态带来了实时流程。

父进程负责获取进程的退出代码;在完成之前,这个过程仍然是一个僵尸。 init进程将获取任何进程的退出代码并将其丢弃,因此”last-resort”父进程将清除任何直接后代的僵尸。

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

请注意,进程永远不负责清理它们的孙子 – 它们总是将进程1恢复为父进程(这就是为什么守护程序作者有时使用double fork()并在中间终止进程以完全取消子进程与调用shell的关联)

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

第三种解决思路

比killall,-9等更容易:

1)使用qBitorrent而不是控制台uTorrent(我正在等待GUI版本,qBitorrent本质上是它)。

2)如果你使用11.04或更高版本,点击alt + f2(打开一个特殊命令窗口),输入xkill,你的鼠标现在是x。单击要关闭的程序(UI =进程ID),它将为您终止它。

高级提示:绑定”xkill”的键盘快捷键,就像我在G15宏键盘上一样。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1745.html,未经允许,请勿转载。