Transmisi sebentar-sebentar tergantung pada NAS saya. Jika saya mengirim SIGTERM, itu tidak hilang dari daftar proses dan <defunct>
label muncul di sebelahnya. Jika saya mengirim SIGKILL, itu masih belum hilang dan saya tidak bisa menghentikan orang tua karena orang tuanya init
. Satu-satunya cara saya dapat menyingkirkan proses dan me-restart Transmission adalah dengan reboot.
Saya menyadari hal terbaik yang dapat saya lakukan adalah mencoba dan memperbaiki Transmisi (dan saya sudah mencoba), tetapi saya seorang pemula dalam kompilasi dan saya ingin memastikan torrent saya selesai sebelum saya mulai mengacaukannya.
init
harus pergi dengan cukup cepat karenainit
menunggu anak-anak secara berkala sebagai salah satu dari banyak tugas umum ...<defunct>
sama dengan zombie?<defunct>
persis sama dengan zombie.init
akan menunggu anak-anaknya sehingga ini seharusnya tidak pernah terjadi secara teori. Saya ingin tahu apa yang terjadi jika Anda mengirimSIGCHLD
keinit
?Jawaban:
Anda tidak dapat membunuh
<defunct>
proses (juga dikenal sebagai proses zombie) karena sudah mati. Sistem menjaga proses zombie bagi orang tua untuk mengumpulkan status keluar. Jika orang tua tidak mengumpulkan status keluar maka proses zombie akan tetap ada selamanya. Satu-satunya cara untuk menghilangkan proses-proses zombie adalah dengan membunuh orang tua. Jika orang tua tidak init maka Anda hanya dapat reboot.Proses zombie hampir tidak membutuhkan sumber daya sehingga tidak ada biaya kinerja untuk membiarkannya bertahan. Meskipun memiliki proses zombie sekitar biasanya berarti ada bug di beberapa program Anda. Init biasanya harus mengumpulkan semua anak. Jika init memiliki anak-anak zombie maka ada bug di init (atau yang lain selain bug itu).
http://en.wikipedia.org/wiki/Zombie_process
sumber
init
tidak pernah dapat memiliki anak zombie. Dari artikel wikipedia: Ketika suatu proses kehilangan induknya, init menjadi induk baru. Init secara berkala mengeksekusi panggilan sistem tunggu untuk menuai zombie apa pun dengan init sebagai induk. Salah satuinit
tanggung jawab adalah menuai anak yatim dan zombie tanpa orangtua.init
dapat memiliki bug. Penggantian initrunit
memiliki bug yang menyebabkan masalah ini.Siapa pun yang mencoba memperbaiki kode sumber Transmisi C harus membaca tentang trik "garpu ganda" untuk menghindari zombie dan penangan sinyal ... dan bagaimana ia dapat digunakan sebagai bagian dari fungsi spawn pintar variadic (lihat Pemijahan di Unix ).
sumber
exit(3)
; anak-anak harus menelepon_exit(2)
sebagai gantinya (jika tidak Anda mendapatkan beberapa stdio flushes, di antara masalah lain). # 2: Ituexecvp(3)
bisa menggunakanperror(3)
jika gagal. # 3: Sebaiknya kamu gunakansignal(SIGCHLD, SIG_IGN)
saja semua kekacauan ini