再起動せずにゾンビプロセスを強制終了する方法はありますか?これがどのように起こったかです:
トレントを使用して12GBファイルをダウンロードしたい。 .torrentファイルを追加した後、送信はゾンビプロセスに変わりました(私もktorrentを試しました。同じ動作です)。最後に、µTorrentを使用してファイルをダウンロードできましたが、プログラムを閉じた後、同様にゾンビに変わります。
kill
、skill
、pkill
を異なるオプションと-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
システムモニターと上部には、ゾンビプロセスがリソースを使用していることが示されます。
編集2:私は何かを見つけたと思う。ログアウトしようとすると、次のメッセージが表示されました。
他のTorrentクライアントにも同じ問題があるため、おそらくファイルサイズに関するものかもしれません。ext4パーティションでubuntu 10.04を使用しています。nautilusを殺してSIGCHLDシグナルを送信できませんでした。
私はゾンビプロセスが頭痛の種であるということはありません。ゾンビプロセスはリソースを消費しません。プロセステーブルにエントリがあるだけです。
ゾンビプロセスは孤立プロセスではなく、親を持っています。
kill
、skill
pkill
は、プロセスが既に強制終了されているため機能しません。エントリが削除されていないだけです。
ゾンビプロセスは、SIGCHLD
シグナルを親に送信することで強制終了できます。 SIGCHLD
の信号番号は17
または18
であると思います
これも失敗する場合は、親自体を殺すことができます。
親がwaitを呼び出す前に子プロセスが終了すると、カーネルはプロセスに関する情報を保持して、親が後でwaitを呼び出せるようにします。子はまだシステムリソースを消費しているが実行していないため、ゾンビプロセスと呼ばれます。
EDIT 1:消費されるシステムリソースは、ほとんどがプロセステーブルエントリです。メモリまたはCPUサイクル-それ以上を消費するかどうかを誰かが知っている場合は、説明を追加してください。私の知る限り、それはほとんど重要なシステムリソースを占有しません。
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に属し、それなしではシステムを実行できません
プロセスがすでに停止しているため、プロセス自体でkill
を使用しても効果はありません。 kill
は、ライブプロセスをゾンビ状態にします。
親プロセスは、プロセスの終了コードを取得します。これが完了するまで、プロセスはゾンビのままです。 init
プロセスは、任意のプロセスの終了コードを取得して破棄するため、直接の子孫であるゾンビをクリーンアップするのは「最終リゾート」の親です。
ゾンビプロセスの親を殺すと、親プロセスがなくなるとすぐにゾンビプロセスがその親としてinit
に戻るため、通常効果的です(つまり、親を殺すとそのプロセスがゾンビになり、祖父母が親の終了コードを読むので、親は本当にいなくなります)。ゾンビはゾンビの親になる可能性があるため、単に親を殺すだけでは十分ではなく、別のプロセス自体によって収集する必要もあります。
プロセスは孫をクリーンアップする責任を負わないことに注意してください-常に親としてプロセス1に戻るため(デーモンの作成者は時々double fork()を使用し、プロセスを途中で終了して、呼び出しから子プロセスを完全に分離します)シェル)
wine
を殺しても効果がないのは、ゾンビプロセスの親ではなかったためです。むしろ、initの直接の子孫である「uTorrent.exe」がそうです。ただし、このプロセスはまだ正常に実行されており、その義務を無視しています。
Killall、-9などよりもはるかに簡単な方法:
1)コンソールuTorrentの代わりにqBitorrentを使用してください(GUIバージョンも待っていますが、qBitorrentは基本的にそれです)。
2)11.04以降を使用している場合は、alt + f2を押して(特別なコマンドウィンドウを開きます)、xkillと入力すると、マウスがxになります。終了するプログラム(UI =プロセスID)をクリックすると、強制終了されます。
高度なヒント:G15マクロキーボードのように、「xkill」のキーボードショートカットをバインドします。
私の場合、ワインがハングアップし、ショットガンでゾンビの子供を殺すことができないとき:
wineserver -k
その後、「プロセスの息子」を殺すkillall -9 Oblivion.exe
(たとえば)
私が理解しているのは、wineserverがすべてのゾンビチャイルドに信号を送り、彼らがすべて死ぬということです(ご存知の散弾銃のため)。したがって、プロセスIDを使用して、追加のkillall -9
またはkill -9
を実行します。