有没有办法在不重启的情况下杀死僵尸进程?事情的经过如下:
我想使用 torrent 下载一个 12GB 的文件。添加 .torrent 文件后,传输变成了僵尸进程(我也试过 ktorrent。同样的行为)。最后我可以使用 µTorrent 下载文件,但关闭程序后,它也变成了僵尸进程。
我尝试使用kill
,skill
并pkill
使用不同的选项和-9
信号,但没有成功。
在网上看了一些解决方案后,我发现杀死父进程可以杀死僵尸进程。但是杀死 wine 也无济于事。
还有其他方法吗?
编辑:
ps -o pid,ppid,统计,通信
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
系统监视器和top显示僵尸进程正在使用资源:
编辑2: 我觉得我发现了一些东西。我尝试注销并看到以下消息:
由于其他 torrent 客户端也有同样的问题,所以可能与文件大小有关。我在 ext4 分区上使用 ubuntu 10.04。杀死 nautilus 并向其发送 SIGCHLD 信号没有作用。
答案1
我不认为僵尸进程会带来多大的麻烦。僵尸进程不占用任何资源。它只是在进程表中有一个条目。
僵尸进程不是孤立进程,它有一个父进程。
kill
,skill
pkill
将不起作用,因为该进程已被终止,只是它的条目尚未被删除。
僵尸进程可以通过向父进程发送信号来杀死SIGCHLD
。我认为信号编号SIGCHLD
是17
或18
如果这也失败了,那么您可能需要杀死父级本身。
来自 Wikipedia 上有关 SIGCHLD 信号的介绍:
当子进程在父进程调用 wait 之前终止时,内核会保留有关该进程的一些信息,以便其父进程稍后调用 wait。由于子进程仍在消耗系统资源但不执行,因此被称为僵尸进程。
编辑1:消耗的系统资源主要是进程表条目。如果有人知道它消耗的资源是否超过这个数字——内存或 CPU 周期,请添加说明。据我所知,它几乎不占用任何重要的系统资源。
在 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
那么很遗憾,我认为你运气不好。进程 ID1
属于 init,没有它你的系统就无法运行。
答案2
在进程本身上使用kill
确实是无效的,因为进程已经死亡;kill
将活动进程带入僵尸状态。
父进程负责拾取进程的退出代码;在完成此操作之前,进程将保持僵尸状态。进程init
将拾取任何进程的退出代码并将其丢弃,因此,它是“最后的手段”父进程,将清理任何直接后代的僵尸进程。
杀死僵尸进程的父进程通常是有效的,因为只要父进程消失,僵尸进程就会恢复为init
其父进程(即杀死父进程会将该进程变成僵尸进程,而祖父进程会读取父进程的退出代码,因此父进程确实消失了)。僵尸进程可以是僵尸进程的父进程,因此仅仅杀死父进程是不够的,它还需要由另一个进程本身来收集。
请注意,进程永远不会负责清理它们的孙进程——它们总是恢复为父进程 1(这就是为什么守护进程作者有时会使用双重 fork() 并在中间终止进程以完全分离子进程与调用 shell 的原因)
之所以杀掉它wine
无效,可能是因为它实际上并不是僵尸进程的父进程,而是 init 的直系后代“utorrent.exe”。然而,这个进程仍在正常运行,只是疏忽了职责。
答案3
比 killall、-9 等更简单的方法:
1)使用 qBitorrent 代替控制台 uTorrent(我也在等待 GUI 版本,qBitorrent 基本上就是它)。
2)如果您使用的是 11.04 或更高版本,请按 alt+f2(打开一个特殊命令窗口),输入 xkill,此时您的鼠标变为 x。单击要关闭的程序(UI = 进程 ID),它将为您终止该程序。
高级提示:为“xkill”绑定一个键盘快捷键,就像我在 G15 宏键盘上所做的那样。
答案4
我猜你正在使用 SSD。
当将大型种子添加到种子客户端时,您正在下载的种子的“占位符”文件实际上会在磁盘上创建,但它们是空的,直到下载过程中逐渐填满。
对于普通硬盘来说,磁盘是瓶颈,您不会注意到桌面其余部分的性能问题。
但是,使用 SSD 时,CPU 是瓶颈,应用程序似乎崩溃了(变灰)。如果你让它待一会儿,它就会恢复,一切都会好起来。这是我换用 SSD 以来的经验。
关于终止进程,其他人提供了比我更好的建议 - 使用 KILL 信号通常有效,但多年来我遇到过一个需要重新启动的奇怪进程。