Linux’ta Süreç Sonlandırma Sanatı: kill ve killall Komutları
Sistem yöneticiliğinin günlük hayatında kaçınılmaz bir an gelir: bir process cevap vermiyor, sistem kaynakları tükeniyor ya da yanlış parametrelerle başlatılmış bir servis var. İşte tam bu noktada kill ve killall komutları devreye giriyor. Bu iki komut, Linux süreç yönetiminin belkemiğini oluşturuyor ve doğru kullanıldığında sizi birçok dertten kurtarıyor.
Bugün bu komutları sadece “process öldürme aracı” olarak değil, sinyal gönderme mekanizmaları olarak ele alacağız. Çünkü işin aslı bu.
Sinyal Kavramını Anlamak
kill komutunun adı biraz yanıltıcı. Aslında bu komut sadece process sonlandırmıyor, bir process’e sinyal gönderiyor. Process ne yapacağına kendisi karar veriyor (bazı sinyaller hariç).
Linux’ta onlarca sinyal türü var. Günlük hayatta en çok kullanacaklarınız şunlar:
| Sinyal | Numara | Açıklama | |——–|——–|———-| | SIGTERM | 15 | Nazik sonlandırma isteği | | SIGKILL | 9 | Zorla sonlandırma (process kaçamaz) | | SIGHUP | 1 | Terminali yeniden bağlama / config yenileme | | SIGINT | 2 | Klavyeden Ctrl+C sinyali | | SIGSTOP | 19 | Process’i dondur | | SIGCONT | 18 | Dondurulmuş process’i devam ettir | | SIGUSR1 | 10 | Kullanıcı tanımlı sinyal 1 | | SIGUSR2 | 12 | Kullanıcı tanımlı sinyal 2 |
Altın kural: Önce SIGTERM dene, olmuyorsa SIGKILL kullan. SIGKILL her zaman ilk tercih olmamalı.
kill Komutu: Temel Kullanım
kill komutu PID (Process ID) üzerinden çalışır. Önce hedef process’in PID’ini bulmanız gerekiyor.
# Process ID'sini bulmak için
ps aux | grep nginx
pgrep nginx
pidof nginx
# Temel kullanım - varsayılan olarak SIGTERM (15) gönderir
kill 1234
# Sinyal numarasıyla kullanım
kill -9 1234
kill -15 1234
kill -1 1234
# Sinyal adıyla kullanım (daha okunabilir)
kill -SIGTERM 1234
kill -SIGKILL 1234
kill -SIGHUP 1234
kill ile Birden Fazla Process Sonlandırma
# Birden fazla PID belirtebilirsiniz
kill -9 1234 5678 9012
# Bir uygulamanın tüm child process'lerini sonlandırma
# Önce process grubunu bulun
ps -eo pid,pgid,cmd | grep apache
# Process grubuna sinyal gönderme (negatif PGID kullanın)
kill -TERM -1234
# Tüm kullanıcı process'lerini sonlandırma (dikkatli kullanın!)
kill -9 -1
> Uyarı: kill -9 -1 komutu shell process’leri dahil tüm process’lerinizi sonlandırır. Production ortamında asla yanlışlıkla çalıştırmayın.
killall Komutu: İsimle Process Sonlandırma
killall komutunun en büyük avantajı PID yerine process ismi kullanması. Özellikle aynı uygulamanın birden fazla instance’ını sonlandırmanız gerektiğinde çok işe yarıyor.
# İsimle process sonlandırma
killall nginx
killall apache2
killall python3
# Sinyal belirterek kullanma
killall -9 chrome
killall -SIGTERM java
# Büyük/küçük harf duyarsız arama
killall -I NGINX
# Belirli bir kullanıcının process'lerini sonlandırma
killall -u webapp python3
killall -u www-data php-fpm
# Onay isteyerek çalıştırma (tehlikeli ortamlarda faydalı)
killall -i python3
# Belirli bir süreden daha uzun çalışan process'leri sonlandırma
killall -o 2h firefox
# Belirli bir süreden daha kısa çalışan process'leri sonlandırma
killall -y 30m zombie_script.sh
killall’ın Dönüş Değerleri
killall komutunun exit code’ları önemli:
- 0: En az bir process bulundu ve sinyal gönderildi
- 1: Hiç process bulunamadı veya sinyal gönderilemedi
- 2: Hata oluştu
Bu değerleri script’lerinizde kullanabilirsiniz:
#!/bin/bash
if killall -q myapp; then
echo "Uygulama basariyla sonlandirildi"
else
echo "Uygulama zaten calismiyordu veya sonlandirilamadi"
fi
Gerçek Dünya Senaryoları
Senaryo 1: Donmuş Nginx Worker’larını Temizleme
Bir gece yarısı Nginx worker process’leri yanıt vermeyi kesiyor ama master process ayakta. Sağlıklı bir yeniden başlatma yapmak istiyorsunuz.
# Mevcut durumu kontrol et
ps aux | grep nginx
# Çıktı: nginx master ve birden fazla worker görünüyor
# Önce graceful reload dene (config yeniden yükleme)
kill -SIGHUP $(cat /var/run/nginx.pid)
# Bu işe yaramazsa graceful shutdown
kill -SIGQUIT $(cat /var/run/nginx.pid)
# Hala çalışıyorsa zorla kapat
kill -SIGTERM $(cat /var/run/nginx.pid)
# Son çare
killall -9 nginx
# Durumu doğrula
sleep 2
ps aux | grep nginx
# Servisi yeniden başlat
systemctl start nginx
Senaryo 2: Runaway Java Process Yönetimi
Bir Java uygulaması CPU’yu %100’e sabitledi. Heap dump alıp sonra kapatmanız gerekiyor.
# Java process'ini bul
ps aux | grep java
# PID: 7823 olduğunu varsayalım
# Önce heap dump al (JVM'e özel sinyal)
kill -SIGUSR1 7823
# veya jmap ile
jmap -dump:format=b,file=/tmp/heapdump.hprof 7823
# Thread dump al (sorun analizi için)
kill -SIGQUIT 7823
# Bu log dosyasına thread dump yazar
# Uygulamaya graceful shutdown fırsatı ver
kill -SIGTERM 7823
# 30 saniye bekle
sleep 30
# Hala çalışıyor mu?
if ps -p 7823 > /dev/null 2>&1; then
echo "Process hala calisiyor, zorla sonlandiriliyor"
kill -9 7823
fi
Senaryo 3: Belirli Bir Kullanıcının Tüm Session’larını Temizleme
Bir kullanıcının sisteme yetkisiz erişim sağladığını fark ettiniz, tüm process’lerini hemen sonlandırmanız gerekiyor.
# Kullanicinin tüm process'lerini listele
ps aux | grep "^suspicious_user"
# pkill ile kullanici bazli sonlandirma (killall alternatifi)
pkill -u suspicious_user
# Daha agresif yaklasim
pkill -9 -u suspicious_user
# killall ile ayni isi yap
killall -u suspicious_user -9
# Kullanicinin login shell'ini de sonlandir
# Önce pts/tty'yi bul
w | grep suspicious_user
# pts/1 uzerinde oldugunu varsayalim
# O terminal'deki tüm process'leri sonlandir
fuser -k /dev/pts/1
Senaryo 4: Zombie Process Temizleme
Zombie process’ler (defunct) sistem kaynaklarını doğrudan tüketmez ama PID tablosunu doldurur. Bunları temizlemek için parent process’e sinyal göndermek gerekir.
# Zombie process'leri bul
ps aux | grep 'Z'
# veya
ps -eo pid,ppid,stat,cmd | grep ' Z '
# Zombie process'in parent PID'ini öğren
# Diyelim zombie PID: 9999, PPID: 8888
cat /proc/9999/status | grep PPid
# Parent process'e SIGCHLD gönder (zombie'yi toplamasını iste)
kill -SIGCHLD 8888
# Parent da sorunluysa onu sonlandir
# Parent sonlaninca init (PID 1) zombie'yi toplar
kill -TERM 8888
# Durumu kontrol et
ps aux | grep 'Z'
pkill: Üçüncü Kardeş
pkill komutu da sinyal göndermek için kullanılıyor ve birçok açıdan killall‘a benziyor ama pattern matching ve daha gelişmiş filtreleme özellikleri sunuyor.
# İsim pattern'iyle eşleştirme
pkill -f "python.*script.py"
# Belirli bir terminal üzerindeki process'leri sonlandir
pkill -t pts/2
# Belirli bir parent'ın child'larını sonlandir
pkill -P 1234
# pgrep ile önce listele, sonra karar ver
pgrep -la python
# Çıktıyı gördükten sonra
pkill python
Script’lerde Güvenli Kullanım
Production ortamında process sonlandırma işlemlerini script’e dökerken dikkatli olmak gerekiyor.
#!/bin/bash
# Güvenli process sonlandirma fonksiyonu
graceful_kill() {
local pid=$1
local timeout=${2:-30} # Varsayilan 30 saniye bekle
local name=${3:-"process"}
if ! ps -p "$pid" > /dev/null 2>&1; then
echo "$name ($pid) zaten calismıyor"
return 0
fi
echo "$name ($pid) icin SIGTERM gonderiliyor..."
kill -TERM "$pid"
local count=0
while ps -p "$pid" > /dev/null 2>&1; do
sleep 1
count=$((count + 1))
if [ "$count" -ge "$timeout" ]; then
echo "Timeout! $name ($pid) SIGKILL ile sonlandiriliyor..."
kill -9 "$pid"
sleep 2
if ps -p "$pid" > /dev/null 2>&1; then
echo "HATA: $name ($pid) sonlandirilamadi!"
return 1
fi
echo "$name ($pid) zorla sonlandirildi"
return 0
fi
done
echo "$name ($pid) basariyla sonlandirildi ($count saniyede)"
return 0
}
# Kullanim
APP_PID=$(pgrep myapp)
if [ -n "$APP_PID" ]; then
graceful_kill "$APP_PID" 60 "MyApp"
fi
Sık Yapılan Hatalar
1. Doğrudan -9 kullanmak
Birçok acemi sysadmin ilk refleks olarak kill -9 kullanıyor. Bu process’in temizlik yapmasına fırsat vermiyor. Açık dosyalar, database bağlantıları, lock dosyaları geride kalabiliyor. Her zaman önce SIGTERM deneyin.
2. PID’i yanlış hedeflemek
# Tehlikeli: grep sonucu kendi grep process'ini de iceriyor olabilir
kill $(ps aux | grep myapp | awk '{print $2}')
# Daha guvenli
kill $(pgrep -x myapp)
# veya
pidof myapp | xargs kill
3. Root yetkisiyle yanlış PID’e sinyal göndermek
Root olarak çalışırken kill -9 1 gibi bir komut init/systemd’yi öldürmeye çalışır. Modern sistemlerde korumalı ama yine de dikkatli olun.
Pratik İpuçları
watch -n 1 'ps aux | grep myapp'ile process’i gerçek zamanlı izleyebilirsiniztimeout 30 myapp || kill $(pgrep myapp)ile uygulamaya süre sınırı koyabilirsiniztrap 'kill $(jobs -p)' EXITile script çıkışında tüm background job’ları temizleyebilirsiniznohupile başlatılan process’ler SIGHUP’ı görmezden gelir, bunu aklınızda bulundurun
Sonuç
kill ve killall komutları göründüğünden çok daha derin araçlar. Sadece “process kapatma” değil, process’lerle iletişim kurma mekanizmaları olarak düşündüğünüzde çok daha etkili kullanıyorsunuz.
Günlük sysadmin hayatında şu sıralamayı öneririm: SIGTERM ile başla, SIGHUP ile config yenile, SIGUSR1/2 ile uygulama sinyalleri gönder, en son çare olarak SIGKILL kullan. Bu yaklaşım hem sisteminizi hem de üzerinde çalışan uygulamaları daha sağlıklı tutuyor.
Zombie process’ler, runaway job’lar, donmuş servisler… Bunların hepsi doğru sinyal ile yönetilebilir. kill komutunu ezbere değil, anlayarak kullandığınızda farkı hemen hissediyorsunuz.
Bir dahaki adım olarak systemctl kill, fuser ve lsof komutlarına da bakmanızı öneririm. Bunlar process yönetimi silahhanenizi tamamlayacak araçlar.