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

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

我想使用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 

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

在此处输入图像描述

在此处输入图像描述

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

在此处输入图像描述

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

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

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

killskill pkill将无法工作,因为该进程已被杀死,只是它的条目尚未被删除。

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

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

来自维基百科的SIGCHLD信号:

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


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


编辑2:从维基百科引用

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

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


编辑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 

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

杀了-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进程将获取任何进程的退出代码并将其丢弃,因此它将是“最后的”父进程,它将清除任何直接后代的僵尸。

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

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

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

比killall,-9等更容易:

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

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

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

在我的情况下,当葡萄酒挂起,我不能用霰弹枪杀死僵尸孩子,我会这样做:

wineserver -k然后我会杀死“过程之子” killall -9 Oblivion.exe (例如)

据我所知,wineserver向所有Zombie Childs发出信号表明他们都将死亡(因为你知道霰弹枪)但有时一个孩子自己想想并想要风暴夺走世界。 所以我使用进程的id执行额外的killall -9kill -9

我的猜测是你正在使用SSD。

向torrent客户端添加大种子时,您下载的torrent的“占位符”文件实际上是在磁盘上创建的,但在下载过程中逐渐填充之前一直是空的。

使用普通硬盘时,磁盘是瓶颈,您不会注意到桌面其余部分的性能问题。

但是,当使用SSD时,CPU是瓶颈,应用程序似乎已崩溃(变灰)。 如果你离开它一段时间,它会恢复,一切都会很好。 这是我转换到SSD后的经验。

关于杀戮过程,其他人提供了比我更好的建议 – 使用KILL信号通常有效,但我有一个奇怪的需要多年重启。