有什么方法可以在不重启的情况下杀死僵尸进程?


48

有什么方法可以在不重启的情况下杀死僵尸进程?这是怎么回事:

我想使用种子下载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信号不起作用。


您可以将ps -o pid,ppid,stat,comm和的输出添加pstree到您的问题吗?
Mikel

我在这里遇到了同样的问题,在谷歌搜索之后,似乎在安装过程中对您的主文件夹进行了加密并选择下载大于4GB的种子时会发生这种情况。除了重启后,我再也找不到其他方法来摆脱消耗99%cpu的僵尸进程。bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975似乎可以解决这个问题,但是似乎并没有做很多事情来解决这个问题:(
user972876 2011年

也请在这里阅读:askubuntu.com/questions/48624/what-are-zombie-processes这将帮助解决许多疑问。
路易斯·阿尔瓦拉多

Answers:


41

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

僵尸进程不是孤立进程,它确实具有父进程。

killskill pkill因为该进程已被杀死,只是没有删除它的条目,所以将不起作用。

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

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

来自Wikipedia的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命令查找进程的父ID

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

你的情况是

猫/ proc / 7298 /状态| grep -i ppid

如果输出像

PPid:1

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


2
你写A zombie process does not take up any resources和引用the child is still consuming system resources ... it is known as a zombie process
maaartinus 2011年

是的 我更新了帖子以明确说明我的意思。
Manish Sinha

7
僵尸进程完全占用了我的CPU内核之一,该内核的使用率达到了100%,因此不仅是进程表条目,我还将在问题中添加其他信息。
Pedram'3

3
使用CPU的僵尸可能正在运行后台线程。尝试使用top -H显示线程而不是顶部的进程。
Zan Lynx 2012年

1
终止进程的主要问题是它们继续使用最终使用的端口。
pietrovismara

10

使用kill过程本身确实是无效的,因为这个过程是已经死了; kill给僵尸国家带来了一个现实的过程。

父流程负责获取流程的退出代码;在完成此过程之前,该过程始终是僵尸。该init进程将提取任何进程的退出代码并将其丢弃,因此,“最后手段”父级将清除任何直接后代的僵尸。

杀死僵尸进程的父进程通常是有效的,因为僵尸进程会init在父进程消失后立即恢复为其父进程(即,杀死父进程将僵尸进程变成僵尸进程,祖父母已阅读父进程的退出代码) ,因此父母确实不在了)。僵尸可以是僵尸的父级,因此仅杀死父级是不够的,还需要由另一个进程本身来收集它。

请注意,进程从不负责清理其孙子进程-它们始终以父进程的身份恢复到进程1(这就是守护程序作者有时使用double fork()并在中间终止进程以完全取消子进程与调用的关联的原因)。贝壳)

杀死wine可能无效的原因是,它并不是僵尸进程的真正源头。而是init的直接后代“ utorrent.exe”。但是,此过程仍在正常运行,只是忽略了其职责。


感谢您提供信息。但是解决方案是什么?
Pedram'3

1
杀死真正的父进程,即在僵尸ps wauxPPID列中列出的进程。
西蒙·里希特

如您所见,在pstree输出中,“ utorrent.exe”没有任何父项。
Pedram

该名称有两个进程,其中一个是另一个的子进程。我怀疑僵尸是孩子,它将使父级“ utorrent.exe”进程负责清理;如果您终止了该进程,则init将清理父进程,然后将孩子重新附加到init,并立即对其进行清理。
西蒙·里希特

killall在这种情况下不起作用。我现在启动µTorrent,它没有任何父或子,但是还不能被杀死。pstree输出已更新。
Pedram

3

比killall,-9等简单得多的方法:

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

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

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


1

在我的情况下,当酒挂起时,我无法用a弹枪杀死僵尸孩子,我会这样做:

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

据我所知,wineserver向其所有的僵尸孩子发出信号,他们都将死(由于您知道you弹枪),但有时一个孩子会自己思考并想席卷整个世界。所以我做额外的killall -9kill -9与进程的ID。


它也没有用,除了传输和ktorrent都存在相同的问题外,它们与葡萄酒无关。
Pedram

我刚才提到了有关将utorrent与wine一起使用的部分,即父母为wine,孩子为utorrent。无论如何,您是否尝试向父级发送信号,让其知道其子级是僵尸(可能没有父级准备就绪)。例如:kill -s SIGCHLD ppid
Luis Alvarado

另外,您拥有哪种类型的硬件,因此它可能有助于找出僵尸如何最大程度地利用资源。
路易斯·阿尔瓦拉多

不幸的是也不行。
Pedram'3

我处理器是酷睿i7 860
Pedram

-4

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

当将大的torrent添加到torrent客户端时,您正在下载的torrent的“占位符”文件实际上是在磁盘上创建的,但是它们是空的,直到在下载过程中逐渐被填充。

对于普通的硬盘,磁盘是瓶颈,并且您不会注意到台式机其余部分的性能问题。

但是,当使用SSD时,CPU成为瓶颈,并且应用程序似乎已崩溃(变为灰色)。如果您将其放置一会儿,它将恢复,并且一切都会好起来。自从切换到SSD以来,这就是我的经验。

关于终止进程,其他人提供了比我更好的建议-使用KILL信号通常可以正常工作,但是多年来我一直很奇怪,需要重启。


1
谢谢,但是我使用的是普通硬盘。
Pedram

1
“但是,当使用SSD时,CPU成为了瓶颈,应用程序似乎崩溃了(变成灰色)。如果将其放置一会儿,它将恢复并且一切都会很好。” 在那种情况下,这个过程不是僵尸。僵尸进程和不间断睡眠中的进程不是一回事。僵尸进程确实不再运行,不占用资源(进程表中的单个条目除外),并且永远无法恢复正常。
伊利亚·卡根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.