Apakah ada cara untuk membunuh proses zombie tanpa reboot?

48

Apakah ada cara untuk membunuh proses zombie tanpa reboot? Inilah bagaimana ini terjadi:

Saya ingin mengunduh file 12GB menggunakan torrent. Setelah menambahkan file .torrent, transmisi berubah menjadi proses zombie (saya mencoba ktorrent juga. Perilaku yang sama). Akhirnya saya bisa mengunduh file menggunakan μTorrent tetapi setelah menutup program, itu berubah menjadi zombie juga.

Saya mencoba menggunakan kill, skilldan pkilldengan berbagai opsi dan -9sinyal tetapi tidak berhasil.

Setelah membaca beberapa solusi di web, saya menemukan bahwa membunuh orang tua dapat membunuh zombie. Tetapi membunuh anggur juga tidak membantu.

Apakah ada cara lain?

Sunting:

ps -o pid, ppid, stat, comm

PID  PPID STAT COMMAND
7121  2692 Ss   bash
7317  7121 R+   ps

pstree output:

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

Monitor sistem dan pertunjukan teratas proses zombie menggunakan sumber daya:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Sunting 2: Saya pikir saya menemukan sesuatu. Saya mencoba keluar dan melihat pesan ini:

masukkan deskripsi gambar di sini

Karena klien torrent lain memiliki masalah yang sama, mungkin ini masalah ukuran file. Saya menggunakan ubuntu 10,04 pada partisi ext4. Membunuh nautilus dan mengirim sinyal SIGCHLD ke sana tidak berfungsi.

Pedram
sumber
Bisakah Anda menambahkan output dari ps -o pid,ppid,stat,commdan pstreeke pertanyaan Anda?
Mikel
Saya mengalami masalah yang sama di sini dan setelah googling tampaknya ini terjadi ketika telah mengenkripsi folder rumah Anda selama instalasi dan memilih untuk mengunduh torrent yang lebih besar dari 4gb. Saya belum bisa menemukan cara lain selain me-reboot untuk menyingkirkan proses zombie makan 99% cpu. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975 tampaknya berurusan dengan ini tetapi tampaknya tidak banyak yang telah dilakukan untuk menyelesaikan ini :(
user972876
Baca juga di sini: askubuntu.com/questions/48624/what-are-zombie-processes Ini akan membantu menyelesaikan banyak keraguan.
Luis Alvarado

Jawaban:

41

Saya tidak menganggap proses zombie itu sakit kepala. Proses zombie tidak memakan sumber daya apa pun. Hanya saja ia memiliki entri di tabel proses.

Proses Zombie bukanlah proses anak yatim, ia memang memiliki orangtua.

kill, skill pkilltidak akan berfungsi karena prosesnya sudah dimatikan, hanya saja entri itu belum dihapus.

Proses zombie dapat dibunuh dengan mengirimkan SIGCHLDsinyal kepada orang tua. Saya pikir nomor sinyal SIGCHLDadalah 17atau18

Jika ini juga gagal, maka Anda mungkin ingin membunuh orang tua itu sendiri.

Dari Wikipedia pada sinyal SIGCHLD:

Ketika sebuah proses anak berakhir sebelum orang tua memanggil menunggu, kernel menyimpan beberapa informasi tentang proses untuk memungkinkan orang tuanya memanggil menunggu nanti. Karena anak masih mengkonsumsi sumber daya sistem tetapi tidak mengeksekusinya dikenal sebagai proses zombie.


EDIT 1 : Sumber daya sistem yang dikonsumsi sebagian besar adalah entri tabel proses. Jika ada yang tahu apakah itu mengkonsumsi lebih dari itu - siklus memori atau CPU, maka silakan tambahkan penjelasan. AFAIK hampir tidak memakan sumber daya sistem yang signifikan.


EDIT 2: Mengutip dari Wikipedia

Pada sistem operasi komputer seperti Unix dan Unix, proses zombie atau proses mati adalah proses yang telah menyelesaikan eksekusi tetapi masih memiliki entri dalam tabel proses. Entri ini masih diperlukan untuk memungkinkan proses yang memulai proses (sekarang zombie) untuk membaca status keluarnya.

Jadi entri disimpan sehingga proses orang tua dapat mengetahui status keluar karena saat anak keluar, orang tua mungkin tidak dalam keadaan atau tidak siap untuk membaca status keluar itu.


EDIT 3

Sampai saat ini saya tidak pernah mengalami proses zombie mengambil 100% dari CPU. Melihat ini untuk pertama kalinya.

Coba lakukan a killall utorrent.exe

Saya dapat melihat bahwa ada dua contoh utorrent.exedan salah satunya adalah zombie. Mungkin yang kedua (anak). killall harus membunuh orang tua karena anak (zombie) tidak dapat dibunuh.


EDIT 4

Sepertinya killall tidak berfungsi karena memberikan sinyal JANGKA bukannya MEMBUNUH

Mencoba killall --signal=KILL utorrent.exe

Jika ini tidak berhasil maka cobalah mematikan proses secara selektif.

Dapatkan daftar proses PID utorrent.exe

ps -e | grep -i utorrent

Anda harus mendapatkan dua proses seperti

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

Jadi yang kedua adalah orang tua. Bunuh itu menggunakan

bunuh -9 yyyy

EDIT 5

Silakan coba cari Id Induk proses dengan perintah bash ini

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

dalam kasus Anda adalah

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

Jika outputnya seperti

PPid: 1

Maka sedihnya saya pikir Anda kurang beruntung. Id Proses 1milik init yang tanpanya sistem Anda tidak dapat berjalan

Manish Sinha
sumber
2
Anda menulis A zombie process does not take up any resourcesdan mengutip the child is still consuming system resources ... it is known as a zombie process.
maaartinus
Ya. Saya memperbarui posting untuk memperjelas apa yang saya maksud.
Manish Sinha
7
Proses zombie mengambil salah satu inti CPU saya sepenuhnya. Penggunaan inti itu 100%. Jadi bukan hanya entri tabel proses. Saya akan menambahkan informasi tambahan ke pertanyaan.
Pedram
3
Zombie yang menggunakan CPU mungkin menjalankan utas latar belakang. Coba gunakan top -Huntuk menampilkan utas alih-alih proses di atas.
Zan Lynx
1
Masalah utama dengan proses mati adalah bahwa mereka tetap menggunakan port yang akhirnya digunakan.
pietrovismara
10

Menggunakan killpada proses itu sendiri memang tidak efektif, karena prosesnya sudah mati; killmembawa proses langsung ke keadaan zombie.

Proses induk bertanggung jawab untuk mengambil kode keluar dari proses; prosesnya tetap menjadi zombie sampai ini selesai. The initProses akan mengambil kode keluar dari proses apapun dan membuangnya, jadi adalah "terakhir-resor" orang tua yang akan membersihkan setiap zombie yang merupakan keturunan langsung.

Membunuh orang tua dari proses zombie biasanya efektif karena proses zombie kemudian kembali initsebagai orang tuanya segera setelah proses orang tua hilang (yaitu membunuh orang tua telah mengubah proses itu menjadi zombie, dan kakek-nenek telah membaca kode keluar orang tua , jadi orang tua benar - benar pergi). Zombie dapat menjadi induk bagi zombie, jadi membunuh orang tua saja tidak cukup, itu juga perlu dikumpulkan oleh proses lain itu sendiri.

Perhatikan bahwa proses tidak pernah bertanggung jawab untuk membersihkan cucu mereka - mereka selalu kembali ke proses 1 sebagai orang tua (itulah sebabnya penulis daemon kadang-kadang menggunakan garpu ganda () dan menghentikan proses di tengah untuk sepenuhnya melepaskan proses anak dari proses memohon. kulit)

Alasan mengapa membunuh winemungkin tidak efektif adalah karena itu bukan induk dari proses zombie; melainkan, "utorrent.exe" yang merupakan turunan langsung dari init adalah. Namun proses ini masih berjalan normal, hanya mengabaikan tugasnya.

Simon Richter
sumber
Terima kasih atas informasinya. Tapi apa solusinya?
Pedram
1
Membunuh nyata proses induk, yaitu salah satu yang ps wauxdaftar di PPIDkolom untuk zombie.
Simon Richter
Seperti yang Anda lihat di output pstree "utorrent.exe" tidak memiliki orangtua.
Pedram
Ada dua proses dengan nama itu, di mana satu adalah anak dari yang lain. Saya menduga zombie adalah anak, yang akan membuat orang tua "utorrent.exe" proses bertanggung jawab atas pembersihan; jika Anda membunuh proses itu, maka init akan membersihkan orang tua, setelah itu anak disambungkan kembali ke init dan segera dibersihkan juga.
Simon Richter
killall tidak berfungsi dalam kasus itu. Saya memulai μTorrent sekarang dan tidak memiliki orang tua atau anak, tetapi belum dapat dibunuh. Output tiga tingkat diperbarui.
Pedram
3

Cara yang jauh lebih mudah daripada killall, -9, dll:

1) Gunakan qBitorrent sebagai ganti konsol uTorrent (Saya juga menunggu versi GUI dan qBitorrent pada dasarnya).

2) Jika Anda menggunakan 11.04 atau lebih tinggi, tekan alt + f2 (membuka jendela perintah khusus), ketik xkill dan mouse Anda sekarang adalah x. Klik pada program yang ingin Anda tutup (UI = ID proses) dan itu akan mematikannya untuk Anda.

Kiat lanjutan: ikat pintasan keyboard untuk "xkill" seperti yang saya miliki di keyboard makro G15.

d4m1r
sumber
1

Dalam kasus saya ketika anggur hang dan saya tidak bisa membunuh anak Zombie dengan senapan yang akan saya lakukan:

wineserver -kmaka saya akan membunuh "Anak Proses" killall -9 Oblivion.exe(Misalnya)

Untuk apa yang saya pahami Wineserver mengirimkan sinyal kepada semua Zombie Childs-nya bahwa mereka semua akan mati (karena senapan yang Anda tahu) tetapi kadang-kadang seorang anak berpikir dengan sendirinya dan ingin membawa dunia dengan badai. Jadi saya melakukan tambahan killall -9atau kill -9dengan proses id.

Luis Alvarado
sumber
Juga tidak berhasil. Selain transmisi dan ktorrent memiliki masalah yang sama dan mereka tidak ada hubungannya dengan anggur.
Pedram
Saya menyebutkan bagian tentang menggunakan utorrent dengan anggur menjadi anggur sebagai orangtua dan utorrent anak. Ngomong-ngomong, apakah Anda mencoba mengirim sinyal kepada orang tua dengan memberi tahu bahwa anaknya adalah zombie (Sesuatu yang tidak siap untuk orang tua). Sebagai contoh:kill -s SIGCHLD ppid
Luis Alvarado
Juga jenis perangkat keras apa yang Anda miliki sehingga mungkin membantu mencari tahu bagaimana zombie dapat menggunakan sumber daya secara maksimal.
Luis Alvarado
Sayangnya tidak berhasil.
Pedram
Prosesor saya adalah core i7 860.
Pedram
-4

Dugaan saya adalah bahwa Anda menggunakan SSD.

Saat menambahkan torrent besar ke klien torrent, file "placeholder" dari torrent yang Anda unduh sebenarnya dibuat pada disk, tetapi kosong hingga secara bertahap diisi selama proses pengunduhan.

Dengan hard disk normal, disk adalah penghambat, dan Anda tidak akan melihat masalah kinerja dengan seluruh desktop Anda.

Namun ketika menggunakan SSD, CPU adalah penghambat, dan aplikasi tampaknya rusak (menjadi abu-abu). Jika Anda membiarkannya sebentar, itu akan pulih dan semuanya akan baik-baik saja. Ini adalah pengalaman saya sejak beralih ke SSD.

Sehubungan dengan proses pembunuhan, yang lain telah memberikan saran yang lebih baik daripada yang saya bisa - menggunakan sinyal KILL biasanya bekerja, tetapi saya memiliki yang aneh yang membutuhkan restart selama bertahun-tahun.


sumber
1
Terima kasih, tetapi saya menggunakan hard disk normal.
Pedram
1
"Namun ketika menggunakan SSD, CPU adalah penghambat, dan aplikasi tersebut tampaknya macet (menjadi abu-abu). Jika Anda membiarkannya sementara waktu, itu akan pulih dan semuanya akan baik-baik saja." Dalam situasi itu, prosesnya bukan zombie. Proses dan proses zombie dalam tidur tanpa gangguan bukanlah hal yang sama. Proses zombie benar-benar tidak berjalan lagi, tidak memakan sumber daya (kecuali satu entri di tabel proses), dan tidak pernah bisa hidup kembali.
Eliah Kagan