Cara membunuh proses zombie

184

Saya meluncurkan program saya di latar depan (program daemon), dan kemudian saya membunuhnya dengan kill -9, tetapi saya mendapatkan zombie yang tersisa dan saya tidak dapat membunuhnya kill -9. Bagaimana cara membunuh proses zombie?

Jika zombie adalah proses mati (sudah terbunuh), bagaimana saya menghapusnya dari output ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
MOHAMED
sumber
2
Apa yang ps -o ppid 1163dikatakan? Yaitu, siapa orang tua 1163? Itulah proses yang harus diakhiri.
William Pursell

Jawaban:

250

Zombie sudah mati, jadi kamu tidak bisa membunuhnya. Untuk membersihkan zombie, itu harus ditunggu oleh orang tuanya, jadi membunuh orang tua harus bekerja untuk menghilangkan zombie. (Setelah orang tua meninggal, zombie akan diwarisi oleh pid 1, yang akan menunggu dan menghapus entri di tabel proses.) Jika daemon Anda memunculkan anak-anak yang menjadi zombie, Anda memiliki bug. Dasmon Anda harus memperhatikan ketika anak-anaknya mati dan waitpada mereka untuk menentukan status keluar mereka.

Contoh bagaimana Anda dapat mengirim sinyal ke setiap proses yang merupakan induk dari zombie (perhatikan bahwa ini sangat kasar dan dapat membunuh proses yang tidak Anda inginkan. Saya tidak menyarankan menggunakan palu godam semacam ini):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
William Pursell
sumber
1
Jika zombie adalah proses mati (sudah terbunuh), bagaimana saya menghapusnya dari output ps aux?
MOHAMED
186
Zombi harus ditunggu oleh orang tuanya. Temukan orang tuanya dan cari tahu mengapa orang tua itu tidak memperhatikan anak-anaknya, lalu ajukan keluhan dengan layanan sosial. ;)
William Pursell
1
Dengan asumsi Anda memiliki proses menghasilkan banyak zombie, masuk akal untuk 'uniq' id:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon
2
biasanya, Anda dapat menemukan orang tua di PPidbaris jika Andacat /proc/<pid>/status
Daniel Andrei Mincă
2
Bayangkan saja orang-orang non-TI datang ke sini dan membaca ini. Gila.
ZitRo
68

Anda dapat membersihkan proses zombie dengan membunuh proses induknya dengan perintah berikut:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
krishna murti
sumber
6
Perintah ini membersihkan zombie dari tabel proses, tetapi itu tidak 'membunuh' zombie. Zombi sudah mati.
William Pursell
8
Itu greptidak perlu. ps ... | awk '/[zZ]/{print $2}'
William Pursell
2
AFAICS, perintah ini tidak membunuh zombie, tetapi mengirimkan SIGHUP ke proses induknya (mungkin membunuh orang tua jika tidak menangani SIGHUP dan menyebabkan zombie untuk diperbaiki reparasi ke init, seperti yang dijelaskan dalam jawaban sebelumnya). Jadi berhati-hatilah dengan perintah ini, mungkin membunuh sesuatu yang tidak Anda harapkan ...
Matthijs Kooijman
1
Ini tidak berhasil untuk saya. saya melakukan "kill -HUP processID" dan prosesnya masih ada sebagai zombie
kommradHomer
1
@ WilliamPursell ketika Anda menjawab pertanyaan, tolong jelaskan konsekuensi dari menggunakan baris perintah dan apa yang dilakukannya secara eksplisit karena itu membunuh semua program yang berjalan di komputer.
Dalek
39

Saya mencoba:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

ini akan bekerja :)

Mohammad Rafiee
sumber
Dalam kasus saya, zombie diciptakan melalui skrip start-up dan program yang tidak dihapus dengan jelas jadi saya membersihkannya.
Mohammad Rafiee
1
Bekerja untukku. Ini akan bekerja dalam kasus-kasus tertentu ketika proses mati telah melahirkan oleh proses membunuh antera.
Eric S. Bullington
2
Saya memeriksa apa yang proses induknya sebelum membunuhnya. Dan saya baru saja membunuhnya menggunakan -9 bukan -1: kill -9 {the parent id}
Ali
Saya juga harus menggunakan -9 untuk membunuh milik saya bukan -1
Michael Smith
28

Ditemukan di http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Berikut ini tip yang bagus dari pengguna lain (Thxs Bill Dandreta): Terkadang

kill -9 <pid>

tidak akan membunuh suatu proses. Lari

ps -xal

bidang ke-4 adalah proses induk, membunuh semua orang tua zombie dan zombie mati!

Contoh

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583Adalah zombie -

kill -9 18581 18582 18583

tidak berpengaruh.

kill -9 31706

menghapus zombie.

Sergio
sumber
3
baik yang baru saja membunuh inituntuk saya, dan sekarang saya tidak bisa melakukan apa-apa dan saya dipaksa untuk memulai kembali ... proses zombie adalah Java, mengambil 3.4GB dari 4GB RAM
Tcll
22

Saya mencoba

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

dan itu bekerja untuk saya.

Jeoffrey
sumber