Linux'ta “Zombi Süreci” Nedir?
Eğer bir Linux kullanıcısıysanız, işlemler listenizde karmakarışık zombi süreçleri görmüş olabilirsiniz. Bir zombi işlemini öldüremezsin, çünkü zaten öldü - gerçek bir zombi gibi.
Zombiler, temel olarak düzgün bir şekilde temizlenemeyen ölü işlemlerin artıklarıdır. Zombi işlemlerini oluşturan bir program uygun şekilde programlanmamıştır - programların zombi işlemlerinin yapışmasına izin vermesi gerekmez.
Resim Kredisi: Flickr'da Daniel Hollister (Remixed)
Zombi Süreci Nedir??
Bir zombi işleminin ne olduğunu ve zombi işlemlerinin ortaya çıkmasına neyin neden olduğunu anlamak için, işlemlerin Linux'ta nasıl çalıştığını biraz anlamanız gerekir..
Bir işlem Linux'ta öldüğünde, hepsi derhal bellekten silinmez - işlem tanımlayıcısı bellekte kalır (işlem tanımlayıcısı yalnızca çok az miktarda bellek kullanır). İşlemin durumu EXIT_ZOMBIE olur ve işlemin ebeveyni, alt işleminin SIGCHLD sinyaliyle öldüğü bildirilir. Ana işlemin daha sonra ö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ü işlemden bilgi almasına izin verir. Wait () çağrıldıktan sonra, zombi işlemi bellekten tamamen kaldırılır..
Bu normalde çok hızlı bir şekilde gerçekleşir, bu nedenle sisteminizde biriken zombi işlemlerini görmezsiniz. Bununla birlikte, bir üst süreç düzgün bir şekilde programlanmadığında ve hiçbir zaman wait () işlevini çağırmazsa, zombi çocukları temizlenene kadar belleğe takılırlar.
GNOME System Monitor gibi hizmetler üst komut ve ps komut ekranı zombi işlemleri.
Zombi Süreçlerinin Tehlikeleri
Zombi işlemleri herhangi bir sistem kaynağını kullanmaz. (Aslında, her biri işlem tanımlayıcısını saklamak için çok az miktarda sistem belleği kullanır.) Ancak, her zombi işlemi işlem kimliğini (PID) korur. Linux sistemleri sınırlı sayıda işlem kimliğine sahiptir - varsayılan olarak 32 bit sistemlerde 32767. Eğer zombiler çok hızlı bir şekilde birikiyorsa - örneğin, uygun şekilde programlanmamış sunucu yazılımı yük altında zombi işlemleri oluşturuyorsa - mevcut PID'lerin tüm havuzu sonunda zombilerin işlemlerine atanır ve diğer işlemlerin başlatılmasını önler.
Bununla birlikte, etrafta takılan birkaç zombi işlemi sorun değildir - ancak sisteminizde üst süreçleriyle ilgili bir hata olduğunu gösterirler..
Zombi Süreçlerinden Kurtulma
SIGKILL sinyaliyle normal süreçleri öldürebileceğiniz için zombi işlemlerini öldüremezsiniz - zombi işlemleri zaten öldü. Sisteminizde çok miktarda olmadıkça, zombi süreçlerinden kurtulmanız gerekmediğini unutmayın - birkaç zombi zararsızdır. Ancak, zombi süreçlerinden kurtulmanın birkaç yolu var.
Bunun bir yolu, SIGCHLD sinyalini üst işleme göndermektir. Bu sinyal üst işlemin wait () sistem çağrısını yürütmesini ve zombi çocuklarını temizlemesini söyler. İle sinyal gönder öldürmek komut, değiştirme pid ana işlemin PID'si ile aşağıdaki komutta:
kill -s SIGCHLD yardımcısı
Bununla birlikte, eğer ana işlem uygun şekilde programlanmamışsa ve SIGCHLD sinyallerini görmezden geliyorsa, bu yardımcı olmaz. Zombilerin ana sürecini öldürmek ya da kapatmak zorunda kalacaksınız. Zombileri oluşturan süreç sona erdiğinde, init, zombi işlemlerini miras alır ve onların yeni ebeveynleri olur. (init, Linux'ta önyükleme sırasında başlatılan ilk işlemdir ve PID 1'e atanır.) init, zombi çocuklarını temizlemek için wait () sistem çağrısını düzenli aralıklarla yürütür, bu nedenle init, zombilerin kısa çalışmasını sağlar. Ana işlemi kapattıktan sonra yeniden başlatabilirsiniz..
Bir ana süreç zombiler oluşturmaya devam ederse, zombi çocuklarını almak için düzgün şekilde bekle () diyecek şekilde düzeltilmelidir. Sisteminizde bir program zombiler oluşturmaya devam ederse bir hata raporu verin.