Cara alternatif untuk membunuh proses zombie

19

Saya hanya memperhatikan beberapa proses zombie di CentOS 6.8 (Final), mencoba untuk membunuh mereka tetapi mereka masih ada di sana:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Seperti yang Anda lihat mereka berjalan selama dua bulan, dan juga jika mereka tidak berbahaya saya akan menyingkirkan mereka, ada cara alternatif untuk membunuh Zombie?

ini
sumber
1
Anda mencoba kill -9?
Ipor Sircer
7
Hanya 747dan 29971merupakan proses zombie. Yang lain mungkin dikunci tetapi mereka belum mati.
roaima
Sepertinya Anda memiliki bug dalam beberapa kode yang berjalan di kucing jantan ...
Boris the Spider

Jawaban:

8

Seperti yang disebutkan oleh Heemayl, Anda tidak bisa benar-benar membunuh zombie. Sudah [tidak] mati ...

Namun, masalah yang Anda hadapi tampak seperti masalah dengan git cloneperintah. Entah bagaimana macet. Mungkin mati atau gagal dengan cara lain? Seringkali karena beberapa I / O proses terjebak pada titik di mana a SIGTERMdan SIGINTtidak akan bekerja.

Untuk membunuhnya, dalam hal ini, Anda ingin menggunakan -9opsi baris perintah. Ini berarti mengirim SIGKILLsinyal. Anda benar-benar dapat menggunakannya -KILLjuga.

[root@host user]# kill -KILL 746 29970

Untuk mendapatkan daftar sinyal yang tersedia, gunakan opsi baris perintah daftar.

[root@host user]# kill -l

Ini menunjukkan kepada Anda angka dan nama (dan Anda akan melihat bahwa # 9 mengatakan SIGKILL.)

Alexis Wilke
sumber
1
Sebenarnya kill -KILLadalah satu-satunya perintah yang dapat menutup proses ini, untuk alasan ini saya akan menerima jawaban @Alexis Wilke. Tapi tentunya saya ingin mengucapkan terima kasih kepada @heemayl jawaban +1 yang cepat, bijaksana dan sangat informatif. Terima kasih kepada semua orang
lese
39

Anda tidak dapat membunuh Zombie (proses), itu sudah mati. Itu hanya menunggu proses induknya untuk melakukan wait(2)dan mengumpulkan status keluarnya. Tidak akan memerlukan sumber daya apa pun pada sistem selain entri tabel proses.

Anda dapat mengirim SIGCHLDke orang tuanya untuk memberi tahu bahwa salah satu dari anak-anaknya telah berakhir (yaitu memintanya untuk mengumpulkan status keluar anak). Sinyal ini dapat diabaikan (yang merupakan default):

kill -CHLD <PPID>

(Ganti <PPID>dengan PID sebenarnya dari induk.)

Atau Anda dapat membunuh proses induk sehingga init(PID 1) akan mewarisi proses zombie dan menuai dengan benar (itu adalah salah satu inittugas utama untuk mewarisi anak yatim dan lakukan wait(2)secara teratur). Tetapi membunuh orang tua tidak dianjurkan. Secara umum, pembuatan proses zombie menunjukkan masalah / masalah pemrograman, dan Anda harus mencoba memperbaiki atau melaporkannya.

heemayl
sumber
8
Anda dapat mengirim SIGCHLD kepada orang tuanya untuk memberi tahu orang tersebut jika anak-anak itu telah dihentikan (yaitu memintanya untuk mengumpulkan status keluar anak), sinyal ini dapat diabaikan (default) Masalahnya adalah bahwa jika suatu proses diabaikanSIGCHLD , tidak ada zombie akan dibuat. Jadi jika itu tidak diabaikan SIGCHLD, dan zombie tidak menuai, prosesnya buggy atau tidak peduli dengan anak-anak zombie. Mengingat proses yang dimaksud adalah git clone ..., saya bertaruh itu sama sekali tidak peduli tentang anak-anak zombie karena itu adalah proses (semoga) berumur pendek yang melakukan tugasnya dan kemudian keluar.
Andrew Henle
1
@AndrewHenle: Meskipun sebagian besar benar, tindakan default ( SIG_DFL) untuk SIGCHILDjuga mengabaikannya, tetapi dalam hal ini zombie pasti tidak secara otomatis menuai.
R ..
@R Meskipun itu sebagian besar benar, tindakan default ( SIG_DFL) untuk SIGCHILDjuga untuk mengabaikannya, tetapi dalam hal ini zombie pasti tidak secara otomatis menuai. Saya tidak yakin apa yang Anda maksud. Apakah Anda mengacu pada proses yang tidak mendapatkan menuai dalam pertanyaan? Saya tidak melihat bagaimana mengirim SIGCHLDke proses yang telah SIGCHLDdiatur handler -nya SIG_IGN(baik secara eksplisit atau secara default) akan menyebabkan proses itu menuai zombie apa pun.
Andrew Henle
1
@AndrewHenle, mengirim SIGCHLDmungkin bekerja saat ini . Terakhir kali mungkin melewatkan sinyal atau dua anak meninggal pada waktu yang sama dan kode tidak cukup pintar untuk menangani kedua kematian secara bersamaan.
Alexis Wilke
Tidak ada salahnya, tapi saya tidak akan membuatnya bekerja.
Barmar
2

untuk mencari proses zombie:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

untuk membunuh proses zombie, ID induk harus dibunuh yaitu PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")
pengguna218243
sumber
0

Ketika proses induk mati, semua proses zombie akan dibersihkan. Jangan bunuh proses induk hanya untuk membersihkan proses zombie. Itu akan datang lagi ketika Anda menjalankan kembali program Anda. Perbaiki program Anda dengan memanggil "tunggu ()" atau "tunggu" ("panggilan sistem") dengan benar.

Sumanth S
sumber