Saya punya proses zombie yang menjengkelkan yang diadopsi oleh init, dan itu tidak akan hilang. Saya pernah membaca ada cara untuk membuat proses dummy, melampirkan zombie sebagai anak dari proses baru dan kemudian membunuhnya, menghapusnya dari tabel proses.
Bagaimana saya melakukannya, tepatnya?
Dan ya, saya sudah membaca sebagian besar dari hal ini:
Proses zombie sudah mati, jadi tidak bisa dibunuh.
Atau
Anda harus reboot sistem Anda
Dan
Proses zombie tidak menggunakan sumber daya apa pun, Anda harus membiarkannya
Sayangnya, banyak program memeriksa tabel proses untuk melihat apakah sebuah instance sudah berjalan, dan akan menolak untuk memulai yang baru jika ada entri dalam tabel proses.
Dan me-reboot setiap kali koneksi SSHFS saya putus, mengambil Sublime dengannya, agak konyol.
Jawaban:
Satu- satunya cara untuk menyingkirkan zombie adalah dengan membuat induknya
wait()
sehingga dapat melaporkan status keluarnya. Anda dapat melakukannya dengan mengirimSIGCHLD
ke induk, dengan asumsi induk ditulis dengan benar.Jika Anda memiliki zombie biasanya berarti orang tua TIDAK ditulis dengan benar (karena anak sudah dikirim
SIGCHLD
ke orang tuanya ketika meninggal dan menjadi zombie), jadi langkah selanjutnya adalah membunuh orang tua.Alat seperti
pstree
(dengan-p
opsi) dapat menunjukkan garis keturunan zombie Anda sehingga Anda tahu proses mana yang merupakan induknya.Ketika orang tua meninggal zombie akan diadopsi oleh
init
, yang selaluwait()
membuat anak-anak mati, dan dengan senang hati akan membunuh semua zombie yang diadopsi.Jika proses induk sebenarnya
init
(PID 1) sudah Anda dalam situasi yang seharusnya tidak pernah terjadi. Anda dapat mencoba mengirimSIGCHLD
keinit
, tetapi Anda benar-benar tidak harus melakukan itu, dan jika itu tidak berhasil, satu-satunya jalan adalah me-reboot karena sistem Andainit
rusak dan tidak melakukan tugasnya.(Ini adalah opsi "senapan".)
Beberapa orang yang lebih kreatif daripada saya juga menemukan opsi ini jika Anda ingin menghindari membunuh proses induk:
(Untuk contoh ini katakanlah zombie adalah PID 3101 dan induknya PID 3100)
gdb
danattach
ke orang tua:attach 3100
waitpid
untuk zombie:call waitpid(3101,0,0)
detach
) dan keluar dari debugger.(Ini adalah senapan sniper yang disetel dengan halus.)
sumber
waitpid()
tidak pernah terpikir oleh saya. Saya mantan programmer yang buruk ...call waitpid
tidak pernah kembali untuk sayaMengapa Anda khawatir tentang proses zombie? Sumber daya mereka tetap terikat sangat minim (ruang untuk tugas kerangka kerangka, PID dan tidak banyak lagi). Tentu, itu tidak pantas, tetapi hanya itu. Mencari orang tua mereka dan memperbaikinya, menggantinya dengan alternatif tertulis yang lebih baik (mungkin memiliki efek samping bermanfaat lainnya), laporkan itu sebagai bug (yang tentu saja mereka).
sumber