20Aug

Linux'ta "Zombi Süreci" Nasıldır?

Eğer bir Linux kullanıcısıysanız, zombi süreçleri süreçler listenizin etrafında dolaşırken görmüş olabilirsiniz. Bir zombi sürecini öldüremezsiniz çünkü zaten zombi öldü - gerçek bir zombi gibi.

Zombi temelde, temizlenmemiş ölü süreçlerin artık bitleridir. Zombi süreçleri oluşturan bir program doğru programlanmamıştır - programların zombi süreçlerinin sadık kalmasına izin verilmemektedir.

Image Kredi: Daniel Hollister Flickr'da( Remix)

Zombi Süreci Nedir?

Bir zombi sürecinin ne olduğunu ve zombi işlemlerinin görünmesine neden olan şeyleri anlamak için, süreçlerin Linux üzerinde nasıl işlediği hakkında biraz bilgi sahibi olmanız gerekir.

Bir süreç Linux'ta öldüğünde, hepsi anında bellekten kaldırılmaz - işlem tanımlayıcısı belleğe kalır( işlem tanımlayıcısı yalnızca çok az miktarda bellek alır).İşlemin durumu EXIT_ZOMBIE olur ve işlemin üst kısmı, alt işleminin SIGCHLD sinyaliyle öldüğünden haberdar edilir.Üst işlemin ardından ölü işlemin çıkış durumunu ve diğer bilgileri okumak için wait() sistem çağrısını yürütecektir. Bu, üst işlemin ölü işlemden bilgi almasını sağlar. Wait() çağrıldıktan sonra, zombi işlemi bellekten tamamen kaldırılır.

Bu normal olarak çok hızlı bir şekilde olur, bu yüzden sisteminizde biriken zombi süreçlerini göremezsiniz. Bununla birlikte, ebeveyn bir süreç düzgün programlanmamışsa ve asla wait() işlevini çağırmazsa, zombi çocukları temizlenene kadar bellekte dolaşacaktır.

GNOME Sistem Monitörü, üst komutu ve ps komutu gibi araçlar, zombi işlemlerini görüntüler.

Zombi İşlemlerinin Tehlikeleri

Zombi süreçleri herhangi bir sistem kaynağı 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 sistemlerinin sonlu sayıda işlem kimliği vardır - 32 bit sistemlerde varsayılan olarak 32767.Zombiler çok hızlı bir hızda birikirse - örneğin yanlış programlanmış sunucu yazılımı yük altında zombi işlemleri oluşturuyorsa - mevcut tüm PID havuzları sonunda zombi işlemlerine atanır ve diğer süreçlerin başlatılmasına engel olur.

Bununla birlikte, birkaç zombi işlemi etrafında takılıyorsa sorun olmaz - ancak bunlar, üst süreçlerinizde sisteminizde hata olduğunu gösterir.

Zombi Süreçlerinden Kurtulmak

Normal süreçleri SIGKILL sinyaliyle öldürebildiğiniz için zombi süreçlerini öldüremezsiniz - zombi işlemleri zaten ölmüş demektir. Unutmayın ki sisteminizde büyük miktarda yoksa zombi süreçlerinden kurtulmanız gerekmez - birkaç zombi zararsızdır. Bununla birlikte, zombi süreçlerinden kurtulmanın birkaç yolu vardır.

Tek yol, SIGCHLD sinyalini üst süreçe göndererek. Bu sinyal üst işlemin wait() sistem çağrısını yürütmesini ve zombi çocuklarını temizlemesini söyler.

kill yerine pid 'yi üst işlemin PID'iyle değiştirerek kill komutuyla sinyal gönder:

kill -s SIGCHLD pid

Ancak, üst süreç uygun şekilde programlanmazsa ve SIGCHLD sinyallerini yoksayarsa, bu sinyali kazandıyardımcı değilimZombilerin ebeveyn sürecini öldürmeniz veya kapatmanız gerekecek. Zombi yaratan süreç sona erdiğinde init, zombi süreçlerini devralır ve yeni üst olur.init, önyükleme sırasında Linux'ta başlatılan ve PID 1'e atanan ilk işlemdir. init, zombi çocuklarını temizlemek için periyodik olarak wait() sistem çağrısını yürütür; bu nedenle init, zombilerin kısa süre içinde çalışmasını sağlayacaktır.Üst işlemi kapattıktan sonra yeniden başlatabilirsiniz.

Bir üst süreç zombi yaratmaya devam ederse, zombi çocuklarını kazanmak için wait() yöntemini doğru bir şekilde çağıracak şekilde düzeltilmelidir. Sisteminizdeki bir program zombiler oluşturmaya devam ediyorsa bir hata raporu gönderin.