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?
kill -9
?747
dan29971
merupakan proses zombie. Yang lain mungkin dikunci tetapi mereka belum mati.Jawaban:
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 clone
perintah. Entah bagaimana macet. Mungkin mati atau gagal dengan cara lain? Seringkali karena beberapa I / O proses terjebak pada titik di mana aSIGTERM
danSIGINT
tidak akan bekerja.Untuk membunuhnya, dalam hal ini, Anda ingin menggunakan
-9
opsi baris perintah. Ini berarti mengirimSIGKILL
sinyal. Anda benar-benar dapat menggunakannya-KILL
juga.Untuk mendapatkan daftar sinyal yang tersedia, gunakan opsi baris perintah daftar.
Ini menunjukkan kepada Anda angka dan nama (dan Anda akan melihat bahwa # 9 mengatakan SIGKILL.)
sumber
kill -KILL
adalah 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 orangAnda 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
SIGCHLD
ke 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):(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 satuinit
tugas utama untuk mewarisi anak yatim dan lakukanwait(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.sumber
SIGCHLD
, tidak ada zombie akan dibuat. Jadi jika itu tidak diabaikanSIGCHLD
, dan zombie tidak menuai, prosesnya buggy atau tidak peduli dengan anak-anak zombie. Mengingat proses yang dimaksud adalahgit 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.SIG_DFL
) untukSIGCHILD
juga mengabaikannya, tetapi dalam hal ini zombie pasti tidak secara otomatis menuai.SIG_DFL
) untukSIGCHILD
juga 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 mengirimSIGCHLD
ke proses yang telahSIGCHLD
diatur handler -nyaSIG_IGN
(baik secara eksplisit atau secara default) akan menyebabkan proses itu menuai zombie apa pun.SIGCHLD
mungkin 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.untuk mencari proses zombie:
untuk membunuh proses zombie, ID induk harus dibunuh yaitu PPID:
sumber
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.
sumber