Hapus proses zombie dari tabel proses

8

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.

skerit
sumber
7
... dengan senapan. ;)
Nathan C
+1, karena saya melihat main dan melihat "kill zombie"
HopelessN00b

Jawaban:

16

Satu- satunya cara untuk menyingkirkan zombie adalah dengan membuat induknya wait()sehingga dapat melaporkan status keluarnya. Anda dapat melakukannya dengan mengirim SIGCHLDke induk, dengan asumsi induk ditulis dengan benar.

Jika Anda memiliki zombie biasanya berarti orang tua TIDAK ditulis dengan benar (karena anak sudah dikirim SIGCHLDke orang tuanya ketika meninggal dan menjadi zombie), jadi langkah selanjutnya adalah membunuh orang tua.
Alat seperti pstree(dengan -popsi) dapat menunjukkan garis keturunan zombie Anda sehingga Anda tahu proses mana yang merupakan induknya.
Ketika orang tua meninggal zombie akan diadopsi oleh init, yang selalu wait()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 mengirim SIGCHLDke init, tetapi Anda benar-benar tidak harus melakukan itu, dan jika itu tidak berhasil, satu-satunya jalan adalah me-reboot karena sistem Anda initrusak 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:

  1. Tentukan PIDS proses zombie & induk '
    (Untuk contoh ini katakanlah zombie adalah PID 3101 dan induknya PID 3100)
  2. Nyalakan gdbdan attachke orang tua:
    attach 3100
  3. Panggilan waitpiduntuk zombie:
    call waitpid(3101,0,0)
  4. Lepaskan dari induk ( detach) dan keluar dari debugger.

(Ini adalah senapan sniper yang disetel dengan halus.)

voretaq7
sumber
1
heh, jawaban yang bagus. "Mosin" senapan di sana.
Danila Ladner
1
@DanilaLadner Saya berharap saya bisa mengambil kredit, tetapi sampai saya melanjutkan pencarian google kecil untuk melihat apa artinya skerit tentang "melampirkan zombie sebagai anak dari proses dummy" pemikiran untuk menggunakan debugger untuk memaksa sesuatu yang waitpid()tidak pernah terpikir oleh saya. Saya mantan programmer yang buruk ...
voretaq7
call waitpidtidak pernah kembali untuk saya
deFreitas
0

Mengapa 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).

vonbrand
sumber