ps Komutu ile Linux’ta Çalışan Süreçleri Listeleme ve Analiz

ps Komutu: Çalışan Süreçleri Listeleme ve Analiz

Sistem yöneticiliğinde günlük hayatın vazgeçilmez komutlarından biri olan ps, adını “process status” yani süreç durumu kelimelerinden alır. Sunucunuzda neler döndüğünü anlamak istediğinizde, bir servis neden cevap vermez diye kafa yorduğunuzda ya da bellek sızıntısı şüphesiyle sistemi incelediğinizde ps komutuna başvurursunuz. Bu yazıda ps komutunu her yönüyle ele alacağız ve gerçek dünya senaryolarıyla pekiştireceğiz.

ps Komutuna Neden İhtiyaç Duyarız?

Linux sistemlerinde her çalışan program bir süreç (process) olarak temsil edilir. Bir web sunucusu, veritabanı, cron job veya basit bir bash betiği, sistem üzerinde çalıştığı sürece bir PID (Process ID) ile kayıt altındadır. Peki bu süreçleri neden izlememiz gerekir?

  • Zombie süreçleri tespit etmek
  • Hangi kullanıcının hangi süreci çalıştırdığını görmek
  • Bellek ve CPU tüketen süreçleri bulmak
  • Servis ayakta mı, değil mi kontrol etmek
  • Güvenlik ihlali şüphesiyle olağandışı süreçleri aramak

top veya htop gibi araçlar anlık ve dinamik izleme için kullanışlıdır, ancak ps çıktısı anlık bir fotoğraf sunar, betiklere gömülebilir ve grep, awk, sort gibi araçlarla kolayca işlenebilir. İşte bu yüzden ps hala birincil tercih olmaya devam eder.

Temel Kullanım ve Syntax

ps komutunun sözdiziminde iki farklı stil bulunur: Unix stili (tire ile) ve BSD stili (tiresiz). Bu durum bazen kafa karıştırıcı olsa da pratikte en çok kullanılan birkaç kombinasyonu ezberlemek yeterlidir.

# Sadece mevcut terminal oturumundaki süreçleri göster
ps

# Tum kullanicilar, tum terminaller, tam format
ps aux

# Unix stili, tum süreçler, tam bilgi
ps -ef

# Belirli bir kullanicinin süreçlerini listele
ps -u www-data

# Belirli bir PID'i sorgula
ps -p 1234

ps aux ile ps -ef arasındaki fark çoğu zaman önemsiz gibi görünse de küçük farklılıklar vardır. aux çıktısında %CPU ve %MEM sütunları bulunurken, -ef formatında STIME (başlangıç zamanı) ve C (CPU kullanım yüzdesi) yer alır. Hangisini kullanacağınız alışkanlığınıza ve ihtiyacınıza göre değişir.

Çıktıyı Anlamak

ps aux çıktısında gördüğünüz sütunları tek tek açıklayalım:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168940 13200 ?        Ss   09:15   0:02 /sbin/init
www-data  1452  0.3  2.1 512340 87640 ?        S    09:16   1:14 nginx: worker
mysql     1890  0.8  8.4 1823440 346200 ?      Sl   09:16   4:32 /usr/sbin/mysqld
  • USER: Süreci başlatan kullanıcı
  • PID: Süreç kimlik numarası
  • %CPU: İşlemci kullanım oranı
  • %MEM: Fiziksel bellek kullanım oranı
  • VSZ: Sanal bellek boyutu (KB)
  • RSS: Gerçek fiziksel bellek kullanımı (KB)
  • TTY: Bağlı olduğu terminal, ? ise arka plan servisi
  • STAT: Süreç durumu
  • START: Sürecin başladığı zaman
  • TIME: Toplam CPU süresi
  • COMMAND: Çalıştırılan komut

STAT sütunundaki harfler özellikle önemlidir:

  • S: Uyku modunda (Sleeping), sinyal veya kaynak bekliyor
  • R: Çalışıyor (Running)
  • Z: Zombie süreç
  • T: Durdurulmuş (Stopped)
  • D: Kesintisiz uyku, genellikle I/O bekliyor
  • s: Oturum lideri
  • l: Çok iş parçacıklı (multi-threaded)
  • +: Ön plan süreç grubu

Gerçek Dünya Senaryosu 1: Bellek Yiyen Süreci Bulmak

Gece 2’de telefon çalıyor. Sunucu yavaşlamış, swap dolmuş. İlk yapacağınız şey en çok bellek tüketen süreçleri bulmak.

# Bellek kullanimina gore sirala, en cok tuketeni en uste getir
ps aux --sort=-%mem | head -20

# Alternatif: awk ile sadece PID, kullanici, %mem ve komutu goster
ps aux --sort=-%mem | awk 'NR<=10 {print $1, $2, $4, $11}' | column -t

Bu komut çıktısı size hızlıca hangi servisin belleği şişirdiğini gösterir. Örneğin Java uygulamaları, beklenmedik şekilde büyüyen PHP-FPM worker’ları veya kontrol altına alınmamış bir Python betiği bu şekilde kolayca tespit edilebilir.

Gerçek Dünya Senaryosu 2: Zombie Süreçleri Avlamak

Zombie süreçler, tamamlanmış ama ebeveyn süreç tarafından henüz “toplanmamış” süreçlerdir. Kendi başlarına bir zarar vermeseler de PID tablosunu doldururlar ve altta yatan bir uygulama hatasına işaret ederler.

# Zombie süreçleri listele
ps aux | grep 'Z'

# Daha temiz bir yontem, sadece zombie süreçleri filtrele
ps -eo pid,ppid,stat,comm | awk '$3 ~ /^Z/'

# Zombie sürecin ebeveynini bul
ps -eo pid,ppid,stat,comm | awk '$3 ~ /^Z/ {print "Zombie PID:", $1, "Parent PID:", $2}'

Zombie süreci öldürmek için genellikle ebeveyn süreci yeniden başlatmak gerekir. Ebeveyn PID’i bulduktan sonra kill -SIGCHLD komutuyla ebeveyne “çocuklarını topla” sinyali gönderebilirsiniz.

Gerçek Dünya Senaryosu 3: Belirli Bir Servisi İzlemek

Production ortamında nginx mi çalışıyor, kaç worker aktif, gerçekten ayakta mı? Bu soruları ps ile yanıtlayabilirsiniz.

# Nginx ile ilgili tum süreçleri bul
ps aux | grep nginx

# grep ciktisini daha temiz hale getir (grep komutunun kendisini hariç tut)
ps aux | grep '[n]ginx'

# Nginx worker sayisini öğren
ps aux | grep '[n]ginx' | grep 'worker' | wc -l

# Bir servis ayakta mi degilse uyari ver
if ps aux | grep -q '[n]ginx'; then
    echo "Nginx calisiyordu."
else
    echo "UYARI: Nginx bulunamadi!"
fi

grep '[n]ginx' numarası klasik bir sysadmin trickidir. Normal grep nginx yazdığınızda, grep komutunun kendisi de arama sonuçlarına girdiğinden sahte bir sonuç alırsınız. Köşeli parantez kullanımı bu durumu önler çünkü grep kendi komut satırında [n]ginx ifadesini arar ama kendisi nginx yazısını içermez.

Gelişmiş Çıktı Formatı: -o Seçeneği

ps komutunun en güçlü özelliklerinden biri özel çıktı formatı oluşturabilmektir. -o seçeneğiyle tam olarak hangi sütunları görmek istediğinizi belirtebilirsiniz.

# Sadece PID, isim, CPU ve bellek goster
ps -eo pid,comm,%cpu,%mem

# Süreç başlangic zamanini ve çalisme süresini göster
ps -eo pid,comm,lstart,etime | head -20

# Tam komut satirini göster (kisaltma olmadan)
ps -eo pid,user,command --no-headers

# Birden fazla sekilde siralama
ps -eo pid,user,%cpu,%mem,command --sort=-%cpu | head -15

lstart sütunu özellikle değerlidir çünkü sürecin tam başlangıç tarihini ve saatini gösterir. “Bu süreç ne zaman başladı?” sorusunu yanıtlamak için oldukça kullanışlıdır. Bir security incident sırasında şüpheli bir sürecin ne zamandan beri çalıştığını bilmek kritik önem taşır.

Süreç Ağacını Görüntülemek

Sistemdeki süreçlerin birbirleriyle ilişkisini anlamak için ağaç görünümü çok işe yarar. Hangi süreç hangisini başlattı, ebeveyn-çocuk ilişkisi nasıl kurulmuş?

# Süreç agacini göster
ps axjf

# Daha okunaklı bir alternatif
ps -ef --forest

# Sadece belirli bir kullanicinin süreç agaci
ps -u deploy --forest

# pstree komutu da benzer is görür (kurulu degilse apt/yum ile kurabilirsiniz)
pstree -p

--forest seçeneği özellikle Apache veya PHP-FPM gibi çok sayıda worker forklamış servislerin yapısını görselleştirmek için harikadır. Ana process hangisi, worker’lar ondan mı türüyor, her şey belirginleşir.

Betiklerle Entegrasyon: ps ile Otomasyon

ps komutunun gerçek gücü betiklere entegre edildiğinde ortaya çıkar. İşte sysadminlerin sıklıkla kullandığı pratik örnekler.

#!/bin/bash
# Bellek kullanimini izleyen basit bir betik
# Belirli bir esigi aşan süreçleri logla

THRESHOLD=50
LOGFILE="/var/log/memory_hogs.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "=== $DATE ===" >> $LOGFILE

ps aux --sort=-%mem | awk -v threshold=$THRESHOLD '
NR > 1 && $4 > threshold {
    print "UYARI:", $1, "PID:", $2, "MEM:", $4"%", $11
}' | tee -a $LOGFILE

# Ayni betikle CPU izleme
HIGH_CPU_PROCS=$(ps aux --sort=-%cpu | awk 'NR>1 && $3>80 {print $2, $3, $11}')

if [ -n "$HIGH_CPU_PROCS" ]; then
    echo "Yüksek CPU kullanan süreçler:" | tee -a $LOGFILE
    echo "$HIGH_CPU_PROCS" | tee -a $LOGFILE
fi

Bu tür betikler cron’a eklenip düzenli aralıklarla çalıştırılabilir. Kritik bir eşiği aştığında e-posta veya Slack bildirimi gönderecek şekilde genişletmek de mümkündür.

ps ve Diğer Araçlarla Birlikte Kullanım

ps komutunu tek başına kullanmak yerine diğer araçlarla zincirlediğinizde çok daha güçlü hale gelir.

# En cok CPU kullanan 5 süreci anlık olarak izle
watch -n 2 'ps aux --sort=-%cpu | head -6'

# Belirli bir portu hangi sürecin kullandığini bul
# Once portu dinleyen PID'i bul
ss -tlnp | grep :80
# Sonra o PID hakkında bilgi al
ps -p $(ss -tlnp | grep :80 | awk '{print $6}' | cut -d',' -f2 | cut -d'=' -f2) -f

# Bir kullanicinin kaç süreci var
ps aux | grep ^deploy | wc -l

# Tüm süreçlerin toplam bellek kullanimi (MB cinsinden)
ps aux | awk 'NR>1 {sum += $6} END {print "Toplam RSS:", sum/1024, "MB"}'

watch komutuyla ps birleştiğinde basit ama etkili bir gerçek zamanlı izleme aracı elde edersiniz. Büyük bir deployment yapıyorsanız ve uygulama davranışını anlık takip etmek istiyorsanız bu kombinasyon oldukça işe yarar.

/proc ile Bağlantı

Pek çok sysadmin bilmez ama ps komutu aslında /proc dosya sistemini okuyarak çalışır. Her PID için /proc// altında detaylı bilgi bulunur.

# Bir sürecin çevre degiskenlerini gör
cat /proc/1234/environ | tr '' 'n'

# Sürecin açik dosyalarini listele (lsof alternatifi)
ls -la /proc/1234/fd

# Süreç hakkinda özet bilgi
cat /proc/1234/status

# Hangi kütüphaneleri kullanıyor
cat /proc/1234/maps | grep '.so'

Bu bilgiler özellikle bir güvenlik olayı sırasında veya uygulama davranışını derinlemesine incelemeniz gerektiğinde çok değerlidir.

Sık Yapılan Hatalar ve İpuçları

Uzun komut satırlarının kısalması: Varsayılan olarak ps uzun komut satırlarını keser. Tam halini görmek için ww seçeneğini kullanın.

ps auxww | grep python

COMMAND ile args farkı: comm sadece çalıştırılabilir dosyanın adını gösterirken, command veya args tüm komut satırını gösterir.

ps -eo pid,comm,args | grep java

PID 1 her zaman init veya systemd’dir: Modern sistemlerde PID 1, systemd’dir. Tüm diğer süreçler dolaylı olarak bu sürecin çocuklarıdır.

Thread’leri görmek için: -L seçeneği ile iş parçacıklarını da listeleyebilirsiniz.

ps -eLf | grep mysqld

Sonuç

ps komutu, onlarca yıllık geçmişine rağmen hala her Linux/Unix sistem yöneticisinin araç kutusunun köşe taşlarından biridir. top, htop, glances gibi modern araçlar grafik ve dinamik izleme konusunda ps önünde olsa da betik entegrasyonu, çıktı özelleştirmesi ve anlık fotoğraf alma konusunda ps rakipsizliğini korur.

Bu yazıda ele aldığımız konuları özetlemek gerekirse:

  • ps aux ve ps -ef temel kullanım kombinasyonları
  • Çıktı sütunlarının ve durum kodlarının anlamı
  • Bellek, zombie ve servis tespiti senaryoları
  • -o ile özel çıktı formatı oluşturma
  • Betiklerle entegrasyon ve otomasyon
  • Diğer araçlarla zincir kullanım

Günlük rutininizde ps aux | grep alışkanlığını edinin. Bir sorunla karşılaştığınızda ilk refleksiniz sisteme “neler oluyor?” diye sormak olsun. ps komutu da tam bu soruya en hızlı cevabı veren araçların başında gelir. İyi log okumalar ve temiz süreç listeleri dilerim.

Yorum yapın