Bash tools
TEKNİK REHBER BASH TOOLS SİSTEM · İZLEME 2026

Süreç ve sistem
izleme.

ps, top, kill, lsof — birinin adını bile bilmeden önce neden var olduklarını anlarsın. Portu kim tutuyor, zombie neden oluşur, en çok RAM kim yiyor?

00 Süreç nedir

Her çalışan program bir süreçtir. Çekirdek her birine benzersiz bir kimlik atar ve kaynaklarını izler.

  PID   Process ID — benzersiz sayısal kimlik
  PPID  Parent PID — hangi süreç bu süreci başlattı
  UID   Süreci başlatan kullanıcı (gerçek kimlik)
  EUID  Efektif kullanıcı (SUID bit varsa farklı olabilir)

  PID 1 → init/systemd (çekirdek başlattı)
    └── PID 458 → sshd
          └── PID 1203 → bash (senin oturumun)
                └── PID 1278 → python server.py
    

Bir süreç öldüğünde ebeveyn bunu wait() ile onaylayana kadar "zombie" (Z) durumda kalır. Çok sayıda zombie → ebeveyn süreçte sorun var.

Süreç durumları

R (Running)
CPU kullanıyor veya çalıştırılmayı bekliyor (run queue'da).
S (Sleeping)
interruptible sleep — bir olayı bekliyor (I/O, timer). Sinyal alabilir.
D (Disk sleep)
uninterruptible sleep — genellikle disk I/O bekliyor. Sinyal alamaz. Çok sayıda D süreci → disk/I/O sorunu.
Z (Zombie)
bitti ama ebeveyn wait() yapmadı. Kaynak tüketmiyor ama PID slot tutuyor.
T (Stopped)
SIGSTOP veya Ctrl+Z ile durduruldu.
I (Idle)
kernel thread, idle bekliyor. Normal.

01 ps — anlık süreç tablosu

ps (process status) sistemdeki süreçlerin anlık görüntüsünü verir.

bash
# En yaygın iki form
ps aux          # BSD stili — tüm süreçler, kullanıcı dahil
ps -ef          # POSIX stili — full format (PPID dahil)

# Belirli sütunlar
ps -o pid,ppid,user,%cpu,%mem,cmd

# Belirli kullanıcının süreçleri
ps -u ali

# Belirli PID
ps -p 1234

# Ağaç görünümü (ps'e özgü)
ps -ejH
# veya:
pstree -p

# Belirli komut adını tara
ps aux | grep nginx

ps aux çıktısını okumak

bash — örnek ps aux çıktısı
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  22528  8192 ?        Ss   Apr09   0:02 /sbin/init
ali       1278  2.3  1.4 312444 57600 ?        Sl   10:23   0:15 python server.py
ali       1290  0.1  0.0  12800  2048 pts/0    S+   10:24   0:00 bash
%CPU
son güncelleme periyodunda CPU kullanımı (kümülatif, çok CPU varsa >100 olabilir).
%MEM
fiziksel belleğin yüzdesi.
VSZ
sanal bellek (KB) — paylaşılan kütüphaneler dahil, yanıltıcı.
RSS
resident set size (KB) — gerçekte fiziksel bellekte tutulan miktar. Daha anlamlı.
STAT
durum kodu: S=sleep, R=run, D=disk, Z=zombie, T=stop. + = foreground.

02 top — gerçek zamanlı izleme

top periyodik olarak yenilenir ve anlık kaynak kullanımını gösterir.

bash
top              # varsayılan, her 3 saniye yeniler
top -u ali       # sadece ali'nin süreçleri
top -p 1278,1290  # belirli PID'ler

# Non-interactive batch modu (betik için)
top -b -n 1 | head -30           # tek anlık görüntü
top -b -n 5 -d 2 | grep python  # 5 döngü, 2sn aralık

top içinde interaktif komutlar

P
CPU'ya göre sırala (varsayılan).
M
belleğe göre sırala (%MEM).
T
toplam CPU süresine göre sırala (TIME+).
k
bir sürece sinyal gönder — PID sor, sinyal sor (15=SIGTERM).
u
kullanıcı filtresi — kullanıcı adı sor.
c
komut adını tam yolda göster.
1
her CPU'yu ayrı göster.
q
çık.

03 htop — interaktif izleme

htop, top'un daha kullanıcı dostu versiyonu. Kurulu değilse: sudo apt install htop

bash
htop              # başlat
htop -u ali       # kullanıcı filtresi
htop -p 1278      # belirli PID
F3 / /
süreç ara (filtre).
F5
ağaç görünümü — ebeveyn-çocuk ilişkisini göster.
F6
sıralama kolonunu değiştir.
F9
sinyaller menüsü — seçilen sürece sinyal gönder.
F2
ayarlar — renk şeması, kolon sırası, CPU gösterim modu.
u
kullanıcıya göre filtrele.
q
çık.
htop avantajları

Fareyle etkileşim (tıklayarak sırala, seç, sonlandır), renk kodlu CPU/bellek çubukları, ağaç görünümü ve yatay kaydırma (uzun komut satırları). top'un daha güçlü hali.

04 kill — sinyal gönder

kill bir süreci "öldürmez" — sinyal gönderir. Süreç bunu nasıl yorumlar, kendisi karar verir.

Temel kullanım

bash
# SIGTERM (15) — nazik: "lütfen kapat"
kill 1278             # varsayılan sinyal 15
kill -15 1278
kill -TERM 1278

# SIGKILL (9) — zorla: "şimdi öl" (yakalanıp engellenemez)
kill -9 1278
kill -KILL 1278

# SIGHUP (1) — daemon'ları yeniden başlatmak/config yüklemek için
kill -HUP 1278
kill -1 1278

# Tüm sinyaller
kill -l

pkill ve killall

bash
# İsme göre öldür (tüm eşleşenler)
pkill python          # "python" içeren tüm süreçler
pkill -9 python
pkill -f 'python server.py'  # -f: tam komut satırında ara

# Belirli kullanıcının süreçlerini öldür
pkill -u ali python

# killall: tam isim eşleşmesi (pkill'den farklı)
killall nginx
killall -HUP nginx     # nginx'e HUP gönder (config reload)

# pgrep: öldürmeden PID bul
pgrep python
pgrep -la python       # PID + komut adı
SinyalNumaraNe yapar
SIGTERM15Nazik sonlandırma isteği. Süreç yakalayıp temizlik yapabilir. İlk tercih.
SIGKILL9Anında sonlandırma. Yakalanıp engel olunamaz. Temizlik olmaz — son çare.
SIGHUP1Terminal kapandı / config yenile. Daemon'larda yeniden başlatma yerine config yüklemek için.
SIGINT2Ctrl+C — interaktif iptal.
SIGSTOP19Durdur (yakalanıp engel olunamaz). Ctrl+Z ile gönderilir.
SIGCONT18Durdurulan süreci devam ettir.
SIGKILL'den önce SIGTERM dene

-9 her zaman ilk tercih olmamalı. SIGKILL'de süreç temizlik yapamaz — açık dosyalar flush edilmez, DB transaction'ları commit olmaz, lock'lar serbest bırakılmaz. Önce kill -15 PID, birkaç saniye bekle, cevap vermiyorsa -9.

05 lsof — açık dosyalar ve portlar

lsof (List Open Files) bir sürecin hangi dosyaları, soketleri, portları açık tuttuğunu gösterir.

bash
# Portu hangi süreç kullanıyor?
lsof -i :8080
lsof -i TCP:80
lsof -i UDP:53

# Belirli PID'nin açık dosyaları
lsof -p 1278

# Belirli kullanıcının açık dosyaları
lsof -u ali

# Belirli dosyayı kim açmış?
lsof /var/log/app.log

# Belirli dizindeki açık dosyalar
lsof +D /var/www/

# Tüm ağ bağlantıları (LISTEN dahil)
lsof -i

# Sadece LISTEN (dinleyen portlar)
lsof -i -s TCP:LISTEN

# Silinen ama hâlâ açık tutulan dosyalar (disk doldu mu diye)
lsof | grep 'deleted'
Disk doldu ama dosya göremiyorum?

Bir süreç büyük bir dosyayı sildiniz ama hâlâ açık tutuyorsa, disk alanı geri gelmez. lsof | grep deleted ile bu dosyaları bul ve o süreci yeniden başlat veya sonlandır.

ss alternatifi

ss -tlnp ve ss -ulnp — netstat'ın modern yerine geçeni. Sadece port/soket bilgisi için lsof'tan hızlı: ss -tlnp | grep :8080.

06 /proc/PID — süreç dosya sistemi

Linux'ta her süreç için /proc altında sanal bir dizin bulunur. Araç kullanmadan doğrudan içine bakabilirsin.

bash
# Komut satırı
cat /proc/1278/cmdline | tr '\0' ' '
# → python server.py

# Ortam değişkenleri
cat /proc/1278/environ | tr '\0' '\n'

# Durum (bellek, durum, signal mask)
cat /proc/1278/status

# Açık dosya descriptor'ları
ls -la /proc/1278/fd/
# 0 → stdin, 1 → stdout, 2 → stderr, 3+ → açık dosyalar

# Ne kadar bellek kullanıyor (detaylı)
cat /proc/1278/smaps | grep '^Rss' | awk '{sum+=$2} END{print sum " kB"}'

# CPU/bellek özeti
cat /proc/1278/stat

# Hangi ağ bağlantıları var
cat /proc/1278/net/tcp
NE OLUYOR

/proc gerçek bir disk dizini değil — kernel'ın bellekten sanal olarak ürettiği bir dosya sistemi. Her okuma gerçek zamanlı bilgi döner. Bu yüzden ps, top, lsof gibi araçlar da /proc'u okur.

07 strace — sistem çağrısı izleme

Bir program ne yapıyor ama neden başarısız oluyor bilmiyorsun? strace her syscall'ı gösterir.

bash
# Komutu çalıştırırken izle
strace ls /tmp

# Sadece belirli syscall'lar (-e)
strace -e trace=open,read,write cat /etc/hosts
strace -e trace=network curl https://example.com

# Çalışan sürece bağlan (-p)
sudo strace -p 1278

# Çıktıyı dosyaya yaz (-o)
strace -o /tmp/strace.log python server.py

# Süre ölç (-T): her syscall ne kadar sürdü
strace -T ls /tmp

# İstatistik (-c): hangi syscall kaç kez, ne kadar sürdü
strace -c ls /tmp
NE ZAMAN strace

Program "neden bu dosyayı açamıyor?", "neden bu porta bağlanamıyor?", "neden bu kadar yavaş?" sorularında. strace çıktısı gürültülü olabilir — -e ile sadece ilgili syscall'ları filtrele. Üretim ortamında dikkatli kullan: izlenen süreci yavaşlatır.

08 Kaynak limiti — ulimit, nice, ionice

Süreçlerin ne kadar kaynak kullanabileceğini sınırla veya önceliğini ayarla.

ulimit

bash
# Mevcut limitleri göster
ulimit -a

# Açılabilecek maksimum dosya sayısı
ulimit -n          # göster
ulimit -n 65536    # ayarla (sadece geçerli shell için)

# Core dump dosyası boyutu
ulimit -c unlimited  # crash dump oluşsun
ulimit -c 0          # core dump oluşmasın

# Sistem geneli kalıcı limit (pam_limits)
# /etc/security/limits.conf:
# ali soft nofile 65536
# ali hard nofile 131072

nice ve renice — CPU önceliği

bash
# nice: -20 (yüksek öncelik) … 0 (normal) … 19 (düşük öncelik)
# Düşük öncelikle çalıştır (sistemin yavaşlamaması için)
nice -n 19 gzip büyük_dosya.log

# Yüksek öncelik (root gerekir)
sudo nice -n -10 python kritik_servis.py

# Çalışan sürecin önceliğini değiştir (renice)
renice -n 10 -p 1278       # PID'ye göre
renice -n 19 -u backup     # kullanıcıya göre

ionice — disk I/O önceliği

bash
# I/O class: 1=realtime, 2=best-effort, 3=idle
# Idle class: diğer süreçlerin I/O'su bitince çalış
ionice -c3 rsync -av /backup/ /nas/

# Best-effort seviye 7 (düşük, 0-7)
ionice -c2 -n7 find / -name '*.log'

# Çalışan sürece uygula
ionice -c3 -p 1278

09 Pratik senaryolar

Sık karşılaşılan durumlar ve nasıl teşhis edildiği.

Portu kim tutuyor?

bash
lsof -i :8080
# veya:
ss -tlnp | grep ':8080'
# → pid=1278 → kill 1278 ya da kill -9 1278

En çok RAM kim yiyor?

bash
ps aux | sort -k4 -rn | head -10
# %MEM'e göre sıralı

Zombie süreçleri bul ve ebeveynini kontrol et

bash
# Zombie'leri listele
ps aux | grep 'Z'

# PPID'yi bul ve ebeveyni incele
ps -o pid,ppid,stat,cmd | grep 'Z'
# → ebeveyne HUP gönder: kill -HUP PPID

Disk doldu ama silinen dosyayı bulamıyorsun

bash
lsof | grep 'deleted' | sort -k7 -rn | head
# PID kolonundan süreci bul → yeniden başlat

Bir komutun hangi dosyalara eriştiğini izle

bash
strace -e trace=openat -f python app.py 2>&1 | grep '^openat'

Hatırlanacaklar

  • ps aux anlık tablo, top canlı, htop interaktif canlı
  • kill -15 PID önce, yanıt yok ise kill -9 PID
  • pkill -f 'komut' — tam komut satırında isim ara, tümünü öldür
  • lsof -i :PORT — portu hangi süreç tutuyor
  • lsof | grep deleted — silinmiş ama açık tutulan dosyalar
  • /proc/PID/ — araçsız ham süreç bilgisi (fd, cmdline, status)
  • strace -e trace=openat komut — dosya erişimlerini izle
  • nice -n 19 komut — düşük CPU önceliği
  • ionice -c3 komut — idle I/O önceliği (sistemi yormaz)