Linux'ta Zombi İşlemleri Nasıl Öldürülür
Yayınlanan: 2022-01-29Kötü yazılmış veya kötü performans gösteren programlar, Linux bilgisayarınızda gizlenen zombi süreçleri bırakabilir. Zombilerin nasıl yaratıldığını ve sonunda onları nasıl dinlenmeye bırakabileceğinizi öğrenin.
Süreç Durumları Linux'ta Nasıl Çalışır?
Linux, elbette, bilgisayarınızda çalışan tüm uygulamaları ve arka plan programlarını takip etmelidir. Bunu yapmanın yollarından biri, işlem tablosunu korumaktır. Bu, çekirdek belleğindeki yapıların bir listesidir. Bu listede her işlemin kendisi hakkında bazı bilgiler içeren bir girişi vardır.
İşlem tablosu yapılarının her birinde çok fazla şey yoktur. İşlem kimliğini, diğer birkaç veri öğesini ve bu işlem için işlem kontrol bloğuna (PCB) bir işaretçiyi tutarlar.
Linux'un her işlem için araması veya ayarlaması gereken birçok ayrıntıyı tutan PCB'dir. PCB ayrıca bir süreç oluşturulduğunda, işlem süresi verildiğinde ve sonunda yok edildiğinde güncellenir.
Linux PCB 95'in üzerinde alan içerir. task_struct.h
adlı bir yapı olarak tanımlanır ve 700 satırın üzerindedir. PCB aşağıdaki bilgi türlerini içerir:
- İşlem Durumu : Durumlar aşağıda açıklanmıştır.
- İşlem Numarası : İşletim sistemi içindeki benzersiz tanımlayıcısı.
- Program Sayacı : Bu işleme CPU'ya bir sonraki erişim verildiğinde, sistem bu adresi, yürütülmesi gereken işlemin bir sonraki talimatını bulmak için kullanacaktır.
- Kayıtlar : Bu işlem tarafından kullanılan CPU kayıtlarının listesi. Liste, akümülatörler, dizin kayıtları ve yığın işaretçileri içerebilir.
- Dosya Listesini Aç : Bu işlemle ilişkili dosyalar.
- CPU Zamanlama Bilgisi : Bu işleme ne sıklıkta ve ne kadar süreyle CPU işlem süresi verileceğini belirlemek için kullanılır. İşlemin önceliği, zamanlama kuyruklarına işaretçiler ve diğer zamanlama parametreleri PCB'ye kaydedilmelidir.
- Bellek Yönetimi Bilgileri : İşlem belleğinin başlangıç ve bitiş adresleri ve bellek sayfalarına yönelik işaretçiler gibi bu işlemin kullandığı bellekle ilgili ayrıntılar.
- G/Ç Durum Bilgileri : İşlem tarafından kullanılan herhangi bir giriş veya çıkış aygıtı.
"Süreç Durumu" aşağıdakilerden herhangi biri olabilir:
- R: Çalışan veya çalıştırılabilir bir süreç. Çalıştırmak, CPU döngülerini almak ve yürütmek anlamına gelir. Çalıştırılabilir bir süreç çalışmaya hazırdır ve bir CPU yuvasını bekler.
- D: Bir uyku süreci. İşlem, bir giriş veya çıkış işlemi gibi bir eylemin tamamlanmasını veya bir kaynağın kullanılabilir hale gelmesini bekliyor.
- D: İşlem kesintisiz uyku durumundadır. Engelleyen bir sistem çağrısı kullanıyor ve sistem çağrıları tamamlanana kadar devam edemiyor. “Uyku” durumundan farklı olarak, bu durumdaki bir süreç, sistem çağrısı tamamlanana ve yürütme sürece geri dönene kadar sinyallere yanıt vermez.
- T:
SIGSTOP
sinyalini aldığı için işlem sonlandırıldı (durduruldu). Yalnızca, sırasıyla işlemi sonlandıran veya devam etmesiniSIGKILL
veyaSIGCONT
sinyallerine yanıt verecektir. Ön plandan (fg
) arka plan (bg)
görevlerine geçtiğinizde olan budur. - Z: Bir Zombi süreci. Bir süreç tamamlandığında, öylece kaybolmaz. Kullandığı tüm belleği boşaltır ve kendisini bellekten kaldırır, ancak işlem tablosundaki ve PCB'deki girişi kalır.
EXIT_ZOMBIE
olarak ayarlanır ve ana işlemine (SIGCHLD
sinyali ile) alt işlemin bittiği bildirilir.
Zombi durumunda, ana süreç, alt süreç oluşturulduğunda wait()
işlev ailelerinden birini çağırır. Daha sonra alt süreçteki durum değişikliğini bekler. Çocuk süreci bir sinyal tarafından durduruldu mu, devam ettirildi mi veya öldürüldü mü? Kodunun doğal olarak tamamlanmasından geçerek sonlandırıldı mı?
Durum değişikliği, alt sürecin çalışmayı durdurduğu anlamına geliyorsa, çıkış kodu okunur. Daha sonra çocuğun PCB'si yok edilir ve işlem tablosundaki girişi kaldırılır. İdeal olarak, bunların hepsi göz açıp kapayıncaya kadar olur ve zombi durumundaki süreçler çok uzun süre var olmaz.
İLGİLİ: Linux'ta Arka Plan İşlemleri Nasıl Çalıştırılır ve Kontrol Edilir
Linux'ta Zombi İşlemlerine Neden Olan Nedir?
Kötü yazılmış bir üst süreç, alt süreç oluşturulduğunda wait()
işlevini çağırmayabilir. Bu, alt süreçteki durum değişikliklerini hiçbir şeyin izlemediği ve SIGCHLD
sinyalinin yok sayılacağı anlamına gelir. Veya kötü programlama veya kötü niyetli niyet nedeniyle başka bir uygulama ana sürecin yürütülmesini etkiliyor olabilir.
Ancak, ana süreç alt süreçteki durum değişikliklerini izlemiyorsa, uygun sistem temizliği gerçekleşmez. Alt süreç sona erdiğinde PCB ve süreç tablosundaki giriş kaldırılmaz. Bu, zombi durumunun PCB'den asla çıkarılmamasına neden olur.
Zombiler biraz bellek kullanır, ancak genellikle bir sorun teşkil etmezler. İşlem tablosundaki giriş küçüktür, ancak serbest bırakılana kadar işlem kimliği yeniden kullanılamaz. 64 bit işletim sisteminde, PCB'nin işlem tablosu girişinden çok daha büyük olması nedeniyle herhangi bir soruna yol açması olası değildir.
Çok sayıda zombi, diğer işlemler için boş olan bellek miktarını muhtemelen etkileyebilir. Bu kadar çok zombiniz varsa, ana uygulama veya işletim sistemi hatasıyla ilgili ciddi bir sorununuz var demektir.
Zombi İşlemleri Nasıl Kaldırılır
Bir zombi sürecini öldüremezsiniz çünkü o zaten ölüdür. Bellekten kaldırıldığı için hiçbir sinyale yanıt vermez; SIGKILL
sinyali gönderecek hiçbir yer yoktur. SIGCHLD
sinyalini ana sürece göndermeyi deneyebilirsiniz, ancak alt süreç sona erdiğinde çalışmadıysa, şimdi de çalışması olası değildir.
Tek güvenilir çözüm, ana süreci öldürmektir. Sonlandırıldığında, alt süreçleri, bir Linux sisteminde çalıştırılan ilk süreç olan init
süreci tarafından devralınır (işlem kimliği 1'dir).
init
işlemi düzenli olarak gerekli zombi temizliğini gerçekleştirir, bu nedenle onları öldürmek için onları yaratan işlemi öldürmeniz yeterlidir. top
komutu, herhangi bir zombiniz olup olmadığını görmenin uygun bir yoludur.
Aşağıdakileri yazın:
Tepe
Bu sistemde sekiz zombi süreci vardır. Bunları ps
komutunu kullanarak ve egrep
içine piping yaparak listeleyebiliriz. Yine, zombi süreçlerinde "Z" durum bayrağı bulunur ve genellikle "feshedilmiş" ifadesini de görürsünüz.
Aşağıdakileri yazın:
ps yardımcı | egrep "Z| feshedilmiş"
Zombi süreçleri listelenir.
Bu, zombilerin süreç kimliklerini keşfetmenin top
. Bu zombileri “badprg” isimli bir uygulamanın da ürettiğini görüyoruz.
İlk zombinin işlem kimliği 7641'dir, ancak üst işleminin işlem kimliğini bulmamız gerekiyor. Bunu tekrar
kullanarak yapabiliriz. ps
ps
yalnızca ebeveynin işlem kimliğini görüntülemesini söylemek için çıktı seçeneğini ( -o
) kullanacağız ve ardından bunu ppid=
bayrağıyla ileteceğiz.
Bulmak istediğimiz işlem -p
(işlem) seçeneği kullanılarak belirtilecek ve ardından zombinin işlem kimliği girilecektir.
Bu nedenle, işlem 7641 için işlem bilgilerini aramak için aşağıdaki komutu yazıyoruz, ancak yalnızca üst işlemin kimliğini bildirecek:
ps -o ppid= -p 7641
Bize üst işlem kimliğinin 7636 olduğu söylendi. Şimdi bir kez daha ps
kullanarak buna çapraz referans verebiliriz.
Bunun, daha önceki ana işlemin adıyla eşleştiğini görüyoruz. Ana işlemi sonlandırmak için, kill komutuyla SIGKILL seçeneğini aşağıdaki gibi kullanın:
öldür -SIGKILL 7636
Üst sürecin sahibine bağlı olarak, sudo
kullanmanız da gerekebilir.
Zombiler Korkutucu Değildir…
… çok büyük bir kalabalığın içinde olmadıkça. Birkaçı endişelenecek bir şey değil ve basit bir yeniden başlatma onları silecek.
Ancak, bir uygulamanın veya işlemin her zaman zombi ürettiğini fark ederseniz, bu, incelemeniz gereken bir şeydir. Büyük olasılıkla sadece özensizce yazılmış bir programdır, bu durumda, belki de alt süreçlerinden sonra düzgün bir şekilde temizlenen güncellenmiş bir sürüm vardır.