🚀 Linux ve Windows sunucularda yeni müşterilere özel %20 indirim! Kod: ILK20  |  Hemen sipariş ver →
build Hata Çözümleri & Otomasyon

Linux Sunucuda Zombie Süreçleri Temizleme Rehberi

Linux sunucularda zombie süreçleri nasıl tespit edilir ve temizlenir? Adım adım çözüm yöntemleri, pkill, kill ve otomatik temizlik için pratik ipuçları.

person
Editör
(Güncellendi: 28 Tem 2026) schedule 5 dk okuma visibility 2 görüntülenme

Linux sunucularında karşılaşılan en can sıkıcı sorunlardan biri zombie süreçlerdir. Bir süreç sonlandığı halde hala işlem tablosunda yer kaplıyorsa buna zombie denir. Bu durum özellikle uzun süre çalışan sunucularda birikerek sorun yaratabilir. Peki zombie süreçleri nasıl temizlenir? Gelin adım adım inceleyelim.

Zombie Süreç Nedir ve Neden Oluşur?

Zombie süreç, aslında tamamen sonlanmış ama ana süreci tarafından bekleme (wait) işlemi yapılmadığı için hâlâ sistem tarafından tutulan bir süreçtir. Örneğin bir web sunucusu çalıştırdığınızda, her bağlantı için yeni bir süreç oluşur. Bu süreç bittiğinde ana sürecin onun çıkış durumunu okuması gerekir. Eğer ana süreciniz bu işlemi yapmazsa, süreç zombie haline gelir. Sistem bunu ps çıktısında Z olarak gösterir.

İlk bakışta zararsız gibi görünse de, sayıları arttıkça PID (process ID) havuzunu tüketebilirler. Sistemdeki PID sayısı sınırlıdır (genelde /proc/sys/kernel/pid_max ile belirlenir, varsayılan 32768). Bu limite ulaşıldığında yeni süreç oluşturulamaz ve sunucu çökme noktasına gelebilir.

Zombie Süreçleri Tespit Etme

Zombie süreçleri görmek için terminalde şu komutu kullanabilirsiniz:

ps aux | grep Z

Ya da daha detaylı liste için:

ps -eo pid,stat,cmd | grep Z

Bu komut size zombie durumundaki süreçlerin PID ve komut bilgisini verir. Ayrıca top komutunda Z sütununu da görebilirsiniz. Örneğin bir sunucuda 50 zombie süreç birikmişse, bu bir alarm zilidir.

Bir başka yöntem de /proc dosya sistemini incelemektir. Zombi süreçler /proc altında hâlâ durur, ancak çoğu bilgi boştur. Aşağıdaki komutla hangi süreçlerin zombie olduğunu daha net görebilirsiniz:

cat /proc/[pid]/status | grep State

Burada [pid] yerine ilgili sürecin PID’sini yazın. Çıktıda Z (zombie) yazıyorsa doğru yoldasınız.

Manuel Temizleme Yöntemleri

Zombie süreçleri doğrudan öldüremezsiniz çünkü zaten ölüdürler. Onları temizlemenin yolu, ana sürecin (parent) beklemeyi yapmasını sağlamaktır. Bunun için üç temel yöntem vardır:

1. Ana Süreci Öldürmek

En kesin çözüm, zombie’nin ana sürecini sonlandırmaktır. Ana süreç öldüğünde, zombie süreçler init (PID 1) tarafından devralınır ve init hemen wait() çağırarak onları temizler. Bunun için:

kill -9 [parent_pid]

Ancak bu riskli olabilir çünkü ana süreç birden fazla alt süreç yönetiyorsa hepsi kaybolur. Örneğin bir Apache web sunucusunun ana sürecini öldürürseniz tüm bağlantılar kesilir.

2. SIGCHLD Sinyali Göndermek

Ana sürece SIGCHLD sinyali göndererek, bekleyen alt süreçlerin durumlarını okumasını sağlayabilirsiniz. Çoğu süreç bu sinyali duyduğunda wait() yapar. Komut:

kill -SIGCHLD [parent_pid]

Bu yöntem daha naziktir. Ancak bazı programlar bu sinyali düzgün işlemez, o yüzden her zaman işe yaramayabilir.

3. GDB ile Müdahale

Daha ileri düzey bir yöntem, gdb kullanarak ana sürece bağlanıp doğrudan wait() işlemini yapmaktır. Örneğin:

gdb -p [parent_pid]
call waitpid([zombie_pid], 0, 0)
quit

Bu yöntem biraz tehlikelidir ve canlı sistemlerde önerilmez, ama acil durumlarda iş görür.

Otomatik Temizlik ve Önleme

Zombie süreçlerin birikmesini engellemenin en iyi yolu, kodlama aşamasında wait() veya waitpid() çağrılarını doğru yapmaktır. Ancak hazır yazılımlarda bunu değiştiremeyiz. Bunun yerine:

Bir Watchdog Betiği Oluşturun

Periyodik olarak çalışan bir bash betiği yazıp zombie süreçleri tespit edip ana süreçlerine SIGCHLD gönderebilirsiniz. Örneğin:

#!/bin/bash
zombies=$(ps aux | grep ' Z ' | awk '{print $2}')
for pid in $zombies; do
ppid=$(ps -o ppid= -p $pid)
kill -SIGCHLD $ppid 2>/dev/null
done

Bu betiği crontab’a ekleyerek her 5 dakikada bir çalıştırabilirsiniz:

*/5 * * * * /usr/local/bin/zombie_cleaner.sh

Sistem Ayarlarını Değiştirin

/etc/security/limits.conf dosyasında kullanıcı başına düşen süreç sayısını sınırlayabilirsiniz. Ayrıca kernel.pid_max değerini artırarak PID havuzunu genişletebilirsiniz:

echo 65536 > /proc/sys/kernel/pid_max

Ancak bu geçici bir çözümdür, asıl neden ortadan kaldırılmalıdır.

Systemd ile Hizmet Yönetimi

Eğer zombie süreçler bir systemd servisinden kaynaklanıyorsa, servisin KillMode ayarını process yerine cgroup yaparak tüm alt süreçlerin temizlenmesini sağlayabilirsiniz. Servis dosyasına şunu ekleyin:

[Service]
KillMode=process

Ardından servisi yeniden başlatın.

Sonuç

Zombie süreçler çok korkutucu olmasa da, birikerek sunucunuzu çalışamaz hale getirebilir. Düzenli olarak sisteminizi kontrol edin, ps ve top komutlarını kullanın. Eğer bir uygulama sürekli zombie üretiyorsa, yazılım geliştiricisine rapor edin. Kendi betiklerinizde wait() kullanmayı unutmayın. Unutmayın, temiz bir sunucu mutlu bir sunucudur!

Bu Makaleyi Paylaş

İlgili Yazılar