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.