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

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

Bir Linux sisteminde neler döndüğünü anlamak istediğinizde, ilk başvuracağınız araçlardan biri ps komutudur. “Process Status” kelimelerinin kısaltması olan ps, sistemde o an çalışan süreçleri listelemenizi sağlar. Basit görünse de, doğru parametrelerle kullanıldığında son derece güçlü bir teşhis aracına dönüşür. Bu yazıda ps komutunu gerçek dünya senaryoları üzerinden ele alacağız.

ps Nedir ve Ne Zaman Kullanılır?

ps komutu, /proc dosya sistemi üzerinden kernel’den süreç bilgilerini okur ve size düzenli bir çıktı sunar. top veya htop gibi sürekli güncellenen araçlardan farklı olarak, ps çalıştırıldığı andaki anlık bir görüntü (snapshot) sunar.

Ne zaman kullanırsınız?

  • Sunucuda beklenmedik bir yük artışı olduğunda
  • Bir servisin gerçekten çalışıp çalışmadığını kontrol ederken
  • Zombie süreçleri tespit ederken
  • Script içinde süreç kontrolü yaparken
  • Hangi kullanıcının hangi süreçleri başlattığını araştırırken

Temel Kullanım

ps komutunun kendi başına çalıştırıldığında fazla bir şey göstermediğini fark edeceksiniz:

ps

Bu komut yalnızca mevcut terminal oturumunuzdaki süreçleri listeler. Çıktı genellikle şöyle görünür:

  PID TTY          TIME CMD
 1234 pts/0    00:00:00 bash
 5678 pts/0    00:00:00 ps

Çoğu zaman işimize yaramaz. Asıl gücü parametrelerle ortaya çıkar.

En Çok Kullanılan Parametreler

aux ile Tüm Süreçleri Listeleme

Sysadmin’lerin en sık kullandığı kombinasyon:

ps aux

Çıktıyı parçalayalım:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168940 11320 ?        Ss   09:15   0:02 /sbin/init
root       423  0.0  0.0  47548  4096 ?        Ss   09:15   0:00 /lib/systemd/systemd-journald
www-data  1842  0.1  1.2 456320 98432 ?        S    09:16   0:45 /usr/sbin/apache2
postgres  2341  0.0  2.1 512840 172044 ?       Ss   09:16   1:12 postgres: writer process

Sütunların anlamı:

  • USER: Süreci başlatan kullanıcı
  • PID: Süreç kimlik numarası
  • %CPU: CPU kullanım yüzdesi
  • %MEM: Bellek kullanım yüzdesi
  • VSZ: Sanal bellek kullanımı (KB)
  • RSS: Fiziksel RAM kullanımı (KB)
  • STAT: Süreç durumu
  • START: Başlangıç zamanı
  • TIME: Toplam CPU süresi
  • COMMAND: Çalıştırılan komut

-ef ile Tam Format Çıktısı

BSD stili aux‘a alternatif olarak Unix stili -ef de sıkça kullanılır:

ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:15 ?        00:00:02 /sbin/init
root       423     1  0 09:15 ?        00:00:00 /lib/systemd/systemd-journald
www-data  1842   423  0 09:16 ?        00:00:45 /usr/sbin/apache2

Burada PPID (Parent Process ID) sütunu da görünür, bu süreç hiyerarşisini anlamak için değerlidir.

STAT Sütunu: Süreç Durumlarını Anlamak

ps aux çıktısındaki STAT sütunu ilk bakışta kafa karıştırıcı görünebilir. Bunları bilmek teşhis sürecini hızlandırır:

  • S: Uyku modunda (Sleeping), bir olay bekliyor
  • R: Çalışıyor (Running) veya çalışmaya hazır
  • D: Kesintisiz uyku (genellikle I/O bekleniyor)
  • Z: Zombie süreç, parent tarafından toplanmamış
  • T: Durmuş (Stopped)
  • s: Oturum lideri
  • l: Multi-threaded
  • +: Ön planda çalışan

Zombie süreçleri bulmak için:

ps aux | grep 'Z'

Ya da daha temiz bir sorgu:

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

Gerçek Dünya Senaryosu 1: Yüksek CPU Kullanan Süreci Bulmak

Sabah 7’de telefonunuz çalıyor, sunucu yavaşlamış. SSH ile bağlanıyorsunuz ve şunu çalıştırıyorsunuz:

ps aux --sort=-%cpu | head -20

--sort=-%cpu ifadesi, CPU kullanımına göre azalan sırada sıralama yapar. Çıktı:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
nobody    9823 98.2  0.5  45632 41200 ?        R    06:42  87:33 /tmp/.hidden_miner
www-data  1842  2.1  1.2 456320 98432 ?        S    09:16   2:15 /usr/sbin/apache2
mysql     2156  1.3  4.2 890324 342100 ?       Sl   09:16   1:44 /usr/sbin/mysqld

İlk satıra bakın. /tmp dizininde çalışan, nobody kullanıcısına ait, 87 dakikadır CPU tüketen şüpheli bir süreç. Bu klasik bir cryptominer işareti. Derhal incelemeniz gerekiyor.

Gerçek Dünya Senaryosu 2: Bellek Sızıntısı Tespiti

Bir Java uygulaması haftalar içinde giderek daha fazla bellek yiyor. Bunu izlemek için:

ps aux --sort=-%mem | head -10

Ya da belirli bir uygulamayı izlemek istiyorsanız:

watch -n 5 'ps aux --sort=-%mem | grep java | head -5'

Bu komut her 5 saniyede bir Java süreçlerinin bellek kullanımını günceller. Zamanla artan RSS değerleri bellek sızıntısına işaret eder.

grep ile Kombinasyon: Belirli Süreçleri Bulmak

Bir servisin çalışıp çalışmadığını kontrol etmek günlük işlerin parçası:

ps aux | grep nginx

Ama bu yaklaşımda küçük bir sorun var. Grep komutu kendisi de çıktıya dahil olur:

www-data  1842  0.1  0.5  89432  41200 ?   S  09:16   0:12 nginx: worker process
root      9999  0.0  0.0  14432   1024 pts/0 S+ 10:23   0:00 grep --color=auto nginx

Bunu engellemek için klasik numara:

ps aux | grep '[n]ginx'

Köşeli parantez kullanımı, grep’in kendisini sonuçlardan dışlamasını sağlar. Çünkü grep '[n]ginx' deseni [n]ginx ifadesini aramaz, nginx‘i arar ve kendi komut satırı grep '[n]ginx' olduğundan eşleşmez.

Alternatif olarak pgrep de kullanabilirsiniz:

pgrep -l nginx

-o ile Özel Çıktı Formatı Oluşturma

ps komutunun en güçlü özelliklerinden biri özel çıktı formatı tanımlayabilmektir. Script yazarken veya belirli bilgileri çekerken son derece kullanışlıdır:

ps -eo pid,ppid,user,%cpu,%mem,stat,start,time,command --sort=-%cpu | head -15

Örneğin yalnızca PID, kullanıcı adı ve komut bilgisini almak istiyorsanız:

ps -eo pid,user,comm

Çıktı:

  PID USER     COMMAND
    1 root     systemd
  423 root     systemd-journal
  456 root     systemd-udevd
 1842 www-data apache2

Bir sürecin başlatıldığı tam zamanı öğrenmek için:

ps -eo pid,lstart,comm | grep apache2

lstart tam tarih ve saat bilgisi verir:

 1842 Mon Nov 13 09:16:23 2023 apache2

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

Süreçler arasındaki parent-child ilişkisini görmek için --forest seçeneği çok işe yarar:

ps aux --forest

Çıktı:

root      1234  0.0  0.1  bash
root      5678  0.0  0.0   _ sudo su
root      5679  0.0  0.1       _ bash
www-data  1842  0.1  1.2  apache2
www-data  1843  0.0  0.8   _ apache2
www-data  1844  0.0  0.8   _ apache2
www-data  1845  0.0  0.8   _ apache2

Bu görünüm özellikle fork bomb durumlarında veya hangi parent sürecin ne kadar child oluşturduğunu anlamak için idealdir.

Sadece belirli bir sürecin ağacını görmek için pstree komutunu da kullanabilirsiniz:

pstree -p 1842

Script İçinde ps Kullanımı

Gerçek sysadmin işi genellikle script yazmayı gerektirir. İşte bazı pratik örnekler:

Servis Kontrol Scripti

#!/bin/bash

SERVICES=("nginx" "mysql" "redis-server")

for service in "${SERVICES[@]}"; do
    if ps aux | grep -q "[${service:0:1}]${service:1}"; then
        echo "[OK] $service çalışıyor"
        PID=$(pgrep -x "$service" | head -1)
        MEM=$(ps -p "$PID" -o %mem --no-headers 2>/dev/null | tr -d ' ')
        echo "     PID: $PID | Bellek: %$MEM"
    else
        echo "[HATA] $service çalışmiyor!"
        # Burada alarm gönderebilir veya servisi yeniden başlatabilirsiniz
    fi
done

Yüksek CPU Uyarı Scripti

#!/bin/bash

THRESHOLD=80
LOG_FILE="/var/log/high_cpu_processes.log"

echo "=== CPU Kontrolü: $(date) ===" >> "$LOG_FILE"

ps aux --sort=-%cpu | awk -v threshold="$THRESHOLD" '
NR>1 && $3+0 > threshold {
    printf "UYARI: PID=%s USER=%s CPU=%%%s CMD=%sn", $2, $1, $3, $11
}' | tee -a "$LOG_FILE"

Gerçek Dünya Senaryosu 3: Belirli Bir Kullanıcının Süreçlerini İnceleme

Güvenlik denetimi sırasında belirli bir kullanıcının ne çalıştırdığını görmek isteyebilirsiniz:

ps -u www-data -o pid,stat,%cpu,%mem,start,time,command

Ya da birden fazla kullanıcı için:

ps -u www-data,nginx,nobody --sort=-%cpu

Bir kullanıcının kaç süreç çalıştırdığını saymak için:

ps -u www-data --no-headers | wc -l

Süreç Bilgilerini /proc ile Karşılaştırma

ps aslında /proc dosya sistemini okur. Bazen doğrudan /proc üzerinden de bilgi alabilirsiniz. Örneğin PID 1842’nin tam komut satırını görmek için:

cat /proc/1842/cmdline | tr '' ' '

ps ile karşılaştırma:

ps -p 1842 -o command

Bir sürecin açık dosyalarını veya ağ bağlantılarını görmek için lsof ve ss komutlarını ps ile birlikte kullanmak çok yaygındır:

# Önce PID bul
PID=$(pgrep nginx | head -1)

# Sonra bu sürecin ağ bağlantılarına bak
ss -tulnp | grep "pid=$PID"

# Ya da açık dosyalara bak
lsof -p "$PID" | head -20

Performans Notu: ps mi, top mu, htop mu?

Bu araçları doğru seçmek önemlidir:

  • ps: Anlık görüntü, script içinde kullanım, belirli süreçleri filtreleme
  • top: Gerçek zamanlı izleme, genel sistem görünümü
  • htop: Daha kullanıcı dostu arayüz, renk desteği, process tree görünümü
  • atop: Tarihsel veri kaydı, daha ayrıntılı kaynak takibi

Otomatik kontroller ve scriptler için her zaman ps tercih edin. top ve htop interaktif kullanım içindir.

Sık Yapılan Hatalar

1. ps aux ile ps -aux Farkı

ps aux    # BSD stili, önerilen
ps -aux   # Unix stili -a -u -x, uyarı verebilir

2. %CPU Değerini Yanlış Yorumlamak

ps aux çıktısındaki %CPU değeri, sürecin başladığından beri ortalama CPU kullanımıdır, anlık değil. Anlık değer için top veya pidstat kullanın.

3. VSZ ile RSS Karıştırmak

VSZ (Virtual Size) çok yüksek görünebilir ama bu yanıltıcıdır. RSS (Resident Set Size) gerçekte RAM’de tutulan kısımdır ve asıl izlemeniz gereken değer budur.

Hızlı Başvuru Tablosu

En sık kullandığım kombinasyonlar:

| Senaryo | Komut | |—|—| | Tüm süreçler | ps aux | | CPU’ya göre sırala | ps aux --sort=-%cpu | | Belleğe göre sırala | ps aux --sort=-%mem | | Süreç ağacı | ps aux --forest | | Belirli kullanıcı | ps -u kullanici | | Belirli PID | ps -p 1234 | | Özel format | ps -eo pid,user,%cpu,command | | Zombie süreçler | ps -A -ostat,ppid,pid,cmd | grep '^Z' |

Sonuç

ps komutu, her Linux sistem yöneticisinin günlük repertuarında olması gereken temel bir araçtır. Basit görünümünün arkasında son derece esnek bir yapı yatar. aux ve -ef kombinasyonlarıyla başlayın, zamanla -o ile özel formatlar oluşturmayı, --sort ile sıralamayı ve grep ile filtrelemeyi alışkanlık haline getirin.

En önemlisi, ps çıktısını okumayı bir refleks haline getirin. Sunucuda bir sorun olduğunda ilk bakacağınız yer burası olmalı. Hangi kullanıcı, hangi PID, ne kadar CPU, ne kadar bellek, ne zaman başlamış. Bu soruların cevabı genellikle sorunun kök nedenini de işaret eder.

Pratik yapın, script yazın ve her gün birkaç dakika sunucunuzun süreç tablosunu inceleyin. Normalin nasıl göründüğünü bilmeden anormali fark edemezsiniz.

Yorum yapın