web-dev-qa-db-ja.com

再起動せずにゾンビプロセスを強制終了する方法はありますか?

再起動せずにゾンビプロセスを強制終了する方法はありますか?これがどのように起こったかです:

トレントを使用して12GBファイルをダウンロードしたい。 .torrentファイルを追加した後、送信はゾンビプロセスに変わりました(私もktorrentを試しました。同じ動作です)。最後に、µTorrentを使用してファイルをダウンロードできましたが、プログラムを閉じた後、同様にゾンビに変わります。

killskillpkillを異なるオプションと-9信号で使用しようとしましたが、成功しませんでした。

Webでいくつかの解決策を読んだ後、親を殺すとゾンビを殺すことができることがわかりました。しかし、ワインを殺しても助けにはなりませんでした。

別の方法はありますか?

編集:

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

システムモニターと上部には、ゾンビプロセスがリソースを使用していることが示されます。

enter image description here

enter image description here

編集2:私は何かを見つけたと思う。ログアウトしようとすると、次のメッセージが表示されました。

enter image description here

他のTorrentクライアントにも同じ問題があるため、おそらくファイルサイズに関するものかもしれません。ext4パーティションでubuntu 10.04を使用しています。nautilusを殺してSIGCHLDシグナルを送信できませんでした。

48
Pedram

私はゾンビプロセスが頭痛の種であるということはありません。ゾンビプロセスはリソースを消費しません。プロセステーブルにエントリがあるだけです。

ゾンビプロセスは孤立プロセスではなく、親を持っています。

killskillpkillは、プロセスが既に強制終了されているため機能しません。エントリが削除されていないだけです。

ゾンビプロセスは、SIGCHLDシグナルを親に送信することで強制終了できます。 SIGCHLDの信号番号は17または18であると思います

これも失敗する場合は、親自体を殺すことができます。

SIGCHLDシグナルに関するウィキペディアから:

親がwaitを呼び出す前に子プロセスが終了すると、カーネルはプロセスに関する情報を保持して、親が後でwaitを呼び出せるようにします。子はまだシステムリソースを消費しているが実行していないため、ゾンビプロセスと呼ばれます。


EDIT 1:消費されるシステムリソースは、ほとんどがプロセステーブルエントリです。メモリまたはCPUサイクル-それ以上を消費するかどうかを誰かが知っている場合は、説明を追加してください。私の知る限り、それはほとんど重要なシステムリソースを占有しません。


編集2:ウィキペディアからの引用

UnixおよびUnixライクなコンピューターオペレーティングシステムでは、ゾンビプロセスまたは機能しないプロセスは、実行は完了したがプロセステーブルにまだエントリがあるプロセスです。このエントリは、(現在のゾンビ)プロセスを開始したプロセスがその終了ステータスを読み取るために必要です。

そのため、子が終了した瞬間、親はおそらく状態になっていないか、終了ステータスを読み取る準備ができていないため、親プロセスが終了ステータスを知ることができるようにエントリが保持されます。


EDIT 3

今まで、CPUの100%を使用するゾンビプロセスを経験したことがありません。これを初めて見る。

killall uTorrent.exeを試してください

uTorrent.exeのインスタンスが2つあり、そのうちの1つがゾンビであることがわかります。おそらく2番目(子)。子(ゾンビ)を殺すことができないので、killallは親を殺すべきです。


EDIT 4

KILLの代わりにTERMシグナルを与えていたため、killallは機能しなかったようです。

killall --signal=KILL uTorrent.exeを試してください

これが機能しない場合は、プロセスを選択的に強制終了してください。

UTorrent.exeプロセスPIDのリストを取得します

ps -e | grep -i uTorrent

次のような2つのプロセスを取得する必要があります

xxxx ?        aa:bb:cc uTorrent.exe defunct
yyyy ?        aa:bb:cc uTorrent.exe

したがって、2番目は親です。使用して殺す

-9 yyyyを殺す

EDIT 5

このbashコマンドでプロセスの親IDを見つけてみてください

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

あなたの場合は

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

出力が次のようになる場合

PPid:1

それから悲しいことに、あなたは運が悪いと思います。プロセスID 1はinitに属し、それなしではシステムを実行できません

41
Manish Sinha

プロセスがすでに停止しているため、プロセス自体でkillを使用しても効果はありません。 killは、ライブプロセスをゾンビ状態にします。

親プロセスは、プロセスの終了コードを取得します。これが完了するまで、プロセスはゾンビのままです。 initプロセスは、任意のプロセスの終了コードを取得して破棄するため、直接の子孫であるゾンビをクリーンアップするのは「最終リゾート」の親です。

ゾンビプロセスの親を殺すと、親プロセスがなくなるとすぐにゾンビプロセスがその親としてinitに戻るため、通常効果的です(つまり、親を殺すとそのプロセスがゾンビになり、祖父母が親の終了コードを読むので、親は本当にいなくなります)。ゾンビはゾンビの親になる可能性があるため、単に親を殺すだけでは十分ではなく、別のプロセス自体によって収集する必要もあります。

プロセスは孫をクリーンアップする責任を負わないことに注意してください-常に親としてプロセス1に戻るため(デーモンの作成者は時々double fork()を使用し、プロセスを途中で終了して、呼び出しから子プロセスを完全に分離します)シェル)

wineを殺しても効果がないのは、ゾンビプロセスの親ではなかったためです。むしろ、initの直接の子孫である「uTorrent.exe」がそうです。ただし、このプロセスはまだ正常に実行されており、その義務を無視しています。

10
Simon Richter

Killall、-9などよりもはるかに簡単な方法:

1)コンソールuTorrentの代わりにqBitorrentを使用してください(GUIバージョンも待っていますが、qBitorrentは基本的にそれです)。

2)11.04以降を使用している場合は、alt + f2を押して(特別なコマンドウィンドウを開きます)、xkillと入力すると、マウスがxになります。終了するプログラム(UI =プロセスID)をクリックすると、強制終了されます。

高度なヒント:G15マクロキーボードのように、「xkill」のキーボードショートカットをバインドします。

3
d4m1r

私の場合、ワインがハングアップし、ショットガンでゾンビの子供を殺すことができないとき:

wineserver -kその後、「プロセスの息子」を殺すkillall -9 Oblivion.exe(たとえば)

私が理解しているのは、wineserverがすべてのゾンビチャイルドに信号を送り、彼らがすべて死ぬということです(ご存知の散弾銃のため)。したがって、プロセスIDを使用して、追加のkillall -9またはkill -9を実行します。

1
Luis Alvarado