Zombi işlemlerinde herhangi bir sistem kaynağı kullanılmadığından , zombi işleminin performans veya yavaşlık üzerinde herhangi bir etkisi olmaz.
Not: - Pratik olarak, hala sınırlı bir kaynak olan PID'yi kullanıyor ve işlem için çekirdek veri yapıları hala tahsis ediliyor. Genellikle, bu çok önemli değildir, ancak çok sınırlı belleğe sahip sistemlerde çekirdek bellek kullanımı önemli olabilir.
Zombi sürecinin neden olduğu sorun
Her zombi işlemi, işlem kimliğini korur. Linux sistemleri süreç kimlikleri sonlu sayıda - 32767 32-bitin systems.If zombiler üzerinde varsayılan olarak çok hızlı bir oranda birikmektedir, mevcut PID'lerin tüm havuz sonunda, zombi süreçlerine atanan başlatmaktan diğer işlemleri engelleyen hale gelecektir.
Not : 64 bit sistemlerde, maksimum PID'yi artırabilirsiniz, bkz. Https://unix.stackexchange.com/a/16884/170373
Ancak, etrafta asılı olan birkaç zombi işlemi sorun değildir - sisteminizdeki ana işlemleriyle ilgili bir hata olduğunu göstermesine rağmen.
Açıklama:
Bir işlem Linux'ta öldüğünde, bunların tümü bellekten hemen kaldırılmaz - işlem tanımlayıcısı bellekte kalır.
Sürecin durumu olur EXIT_ZOMBIE
ve sürecin ebeveynine alt sürecinin SIGCHLD
sinyal ile öldüğü bildirilir .
Üst işlemin, ölü işlemin çıkış durumunu ve diğer bilgileri okumak için wait () sistem çağrısını yürütmesi beklenir. Bu, ana sürecin ölü süreçten bilgi almasını sağlar. Wait () çağrıldıktan sonra zombi işlemi bellekten tamamen kaldırılır.
Bu normalde çok hızlı gerçekleşir, bu nedenle sisteminizde biriken zombi süreçlerini görmezsiniz. Ancak, bir üst süreç düzgün programlanmadıysa ve asla wait () çağrısı yapmazsa, zombi çocukları temizlenene kadar bellekte kalırlar.
Çözüm:
SIGKILL sinyali ile normal süreçleri öldürebileceğiniz için zombi süreçlerini öldüremezsiniz - zombi süreçleri zaten ölmüştür.
Zombi öldürmenin bir yolu, ana işleme SIGCHLD sinyalinin gönderilmesidir. Bu sinyal ebeveyn işlemine wait () sistem çağrısını yürütmesini ve zombi çocuklarını temizlemesini söyler. Aşağıdaki komuttaki pid'i üst sürecin PID'si ile değiştirerek sinyali kill komutuyla gönderin:
kill -s SIGCHLD pid
Zombileri oluşturan süreç sona erdiğinde, init zombi süreçlerini devralır ve yeni ebeveynleri olur. (init, Linux'ta önyükleme sırasında başlatılan ve PID 1'e atanan ilk işlemdir.)
Not: - Linux 3.4'ten itibaren işlemler, PR_SET_CHILD_SUBREAPER seçeneğiyle prctl () sistem çağrısını düzenleyebilir ve sonuç olarak, # 1 işlemi değil, öksüz torunlarının üst öğesi olurlar. Bakınız: /unix//a/177361/5132
INIT daha sonra zombi çocuklarını temizlemek için wait () sistem çağrısını yürütür, böylece init zombilerin kısa çalışmasını yapar. Üst işlemi kapattıktan sonra yeniden başlatabilirsiniz.