/proc Dosya Sistemi: Süreç ve Sistem Bilgisi Okuma

Linux sistemlerde her şey bir dosyadır derler ya, işte bu felsefeyi en iyi örnekleyen yer /proc dosya sistemidir. Disk üzerinde tek bir byte yer kaplamayan, tamamen bellekte yaşayan bu sanal dosya sistemi, çalışan bir Linux sisteminin tam anlamıyla X-ray görüntüsüdür. Kernel’in size açık tuttuğu bir pencere olarak düşünebilirsiniz: hangi süreçlerin çalıştığından, CPU’nun hangi frekansda çalıştığına, ağ bağlantı tablolarından bellek kullanımına kadar her şey burada, sade metin dosyaları halinde sizi bekliyor.

Yıllarca sistem yöneticiliği yaptıktan sonra şunu söyleyebilirim: /proc‘u gerçekten anlayan bir sysadmin, top veya htop gibi araçlara bağımlı kalmak yerine sorunları kaynağında, ham veriyle teşhis edebilir. Bu da hem daha hızlı hem de çok daha doğru sonuçlar verir.

/proc Nedir ve Neden Önemlidir?

/proc, Linux çekirdeğinin çalışma zamanında oluşturduğu ve yönettiği bir sanal dosya sistemidir (procfs). Mount edildiğinde disk üzerinde hiçbir yer kaplamaz; gördüğünüz her dosya ve dizin, kernel tarafından anlık olarak üretilir. cat /proc/cpuinfo komutunu çalıştırdığınızda kernel o anda CPU bilgisini derleyip size sunuyor, dosyada önceden yazılmış bir şey yok.

Bu yapının birkaç kritik avantajı var:

  • Anlık veri: Her okumada güncel bilgi alırsınız
  • Standart araçlarla erişim: cat, grep, awk, sed gibi bildiğiniz araçlar çalışır
  • Script dostu: Monitoring scriptlerinizde doğrudan kullanabilirsiniz
  • Düşük overhead: Ekstra daemon veya agent gerektirmez

/proc altındaki yapıya bakacak olursak iki ana kategori var: sayısal isimli dizinler (PID’lere karşılık gelir) ve sistem genelindeki bilgi dosyaları.

ls /proc/
# 1  2  3  ...  1547  cpuinfo  meminfo  net  sys  version  uptime ...

Sistem Geneli Bilgi Dosyaları

/proc/cpuinfo – İşlemci Detayları

CPU hakkında her şeyi burada bulursunuz. Kaç core var, hangi özellikler destekleniyor, frekans nedir?

# Temel CPU bilgisi
cat /proc/cpuinfo

# Kaç fiziksel işlemci var?
grep "physical id" /proc/cpuinfo | sort -u | wc -l

# Kaç core var?
grep "cpu cores" /proc/cpuinfo | head -1

# CPU model adı
grep "model name" /proc/cpuinfo | head -1

# Hangi CPU flagları destekleniyor? (sanallaştırma için vmx/svm)
grep flags /proc/cpuinfo | head -1 | tr ' ' 'n' | grep -E "vmx|svm|avx|aes"

Gerçek dünya senaryosu: Bir uygulama sunucusuna migration yaparken hedef makinenin AES-NI donanım şifreleme desteği olup olmadığını kontrol etmek istiyorsunuz. grep aes /proc/cpuinfo size anında cevap verir. VMware veya KVM üzerinde VM oluşturmadan önce vmx veya svm flag’inin olup olmadığını da bu şekilde doğrularsınız.

/proc/meminfo – Bellek Durumu

free komutunun arka planda okuduğu kaynak burasıdır.

cat /proc/meminfo

# Sadece kritik değerleri görmek için
grep -E "MemTotal|MemFree|MemAvailable|SwapTotal|SwapFree|Cached|Buffers" /proc/meminfo

Önemli alanlar:

  • MemTotal: Toplam fiziksel RAM
  • MemAvailable: Gerçekten kullanılabilir bellek (MemFree + geri alınabilir cache)
  • Buffers: I/O buffer’ları için ayrılmış alan
  • Cached: Dosya sistemi cache’i
  • SwapTotal / SwapFree: Swap durumu
  • Dirty: Diske henüz yazılmamış “kirli” sayfalar
  • Slab: Kernel slab allocator tarafından kullanılan bellek

MemAvailable‘a özellikle dikkat edin. MemFree düşük görünse bile MemAvailable yüksekse sistem sağlıklıdır; kernel cache’i gerektiğinde boşaltır.

/proc/uptime – Sistem Çalışma Süresi

cat /proc/uptime
# 432167.45 1687234.12

# İlk değer: sistem uptime (saniye)
# İkinci değer: tüm CPU'ların idle zamanlarının toplamı

Bunu okunabilir formata çevirmek için:

awk '{
    seconds = int($1)
    days = int(seconds/86400)
    hours = int((seconds%86400)/3600)
    minutes = int((seconds%3600)/60)
    printf "Uptime: %d gun, %d saat, %d dakikan", days, hours, minutes
}' /proc/uptime

/proc/loadavg – Sistem Yükü

cat /proc/loadavg
# 0.52 0.48 0.61 2/847 12453

Çıktının anlamı:

  • 1. değer: Son 1 dakikadaki ortalama yük
  • 2. değer: Son 5 dakikadaki ortalama yük
  • 3. değer: Son 15 dakikadaki ortalama yük
  • 4. değer: Çalışan süreç sayısı / toplam süreç sayısı
  • 5. değer: En son oluşturulan sürecin PID’i

Kural olarak: yük değeri CPU core sayısından yüksekse sistem yük altında demektir.

/proc/version ve /proc/sys/kernel

# Kernel versiyonu
cat /proc/version

# Hostname
cat /proc/sys/kernel/hostname

# Kernel parametreleri (sysctl değerleri burada yaşar)
cat /proc/sys/net/ipv4/ip_forward
cat /proc/sys/vm/swappiness
cat /proc/sys/fs/file-max

/proc/sys altındaki değerleri hem okuyabilir hem de yazabilirsiniz. sysctl komutu aslında bu dosyaları kullanır:

# Bu iki komut aynı işi yapar
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward

# Geçici olarak değiştirme
echo 1 > /proc/sys/net/ipv4/ip_forward

Süreç Bazlı /proc/[PID] Dizinleri

Her çalışan süreç için /proc altında o sürecin PID’iyle adlandırılmış bir dizin bulunur. Bu dizinin içi o sürecin tam anatomisidir.

# Örnek: PID 1234'ün /proc dizinine bakalım
ls /proc/1234/
# attr  cgroup  cmdline  comm  cwd  environ  exe  fd  fdinfo
# io  limits  maps  mem  net  ns  oom_score  smaps  stat  status  wchan

/proc/[PID]/status – Süreç Durumu Özeti

# Bir sürecin PID'ini bulalım
PID=$(pgrep nginx | head -1)

cat /proc/$PID/status

Önemli alanlar:

  • Name: Süreç adı
  • State: Çalışma durumu (R=running, S=sleeping, D=disk wait, Z=zombie, T=stopped)
  • Pid / PPid: Süreç ve üst süreç PID’leri
  • VmRSS: Gerçekte kullanılan fiziksel bellek (Resident Set Size)
  • VmSize: Sanal bellek alanı
  • Threads: Thread sayısı
  • voluntary_ctxt_switches: Gönüllü context switch sayısı

/proc/[PID]/cmdline – Başlatma Komutu

Bu dosya, süreci başlatan tam komutu gösterir. Argümanlar null byte ile ayrılmıştır.

# Ham hali
cat /proc/1/cmdline

# Okunabilir format
cat /proc/1/cmdline | tr '' ' '

# Tüm süreçlerin başlatma komutlarını listele
for pid in /proc/[0-9]*/cmdline; do
    p=$(echo $pid | cut -d/ -f3)
    cmd=$(cat $pid 2>/dev/null | tr '' ' ' | head -c 100)
    [ -n "$cmd" ] && echo "PID $p: $cmd"
done

/proc/[PID]/fd – Açık Dosyalar

# Bir sürecin açık dosya tanımlayıcılarını listele
ls -la /proc/$PID/fd

# Kaç dosya açık?
ls /proc/$PID/fd | wc -l

# Hangi dosyalar açık? (lsof'un yaptığı bu)
for fd in /proc/$PID/fd/*; do
    target=$(readlink $fd 2>/dev/null)
    echo "$fd -> $target"
done

Gerçek dünya senaryosu: Bir uygulama “too many open files” hatası veriyor. İlk başvuracağınız yer:

APP_PID=$(pgrep java | head -1)

# Kaç dosya descriptor açık?
echo "Açık FD sayısı: $(ls /proc/$APP_PID/fd | wc -l)"

# Sistemin izin verdiği maksimum
cat /proc/$APP_PID/limits | grep "open files"

# En çok hangi tür dosyalar açık?
ls -la /proc/$APP_PID/fd | awk '{print $NF}' | grep -oP '^[^/]+' | sort | uniq -c | sort -rn

/proc/[PID]/maps ve /proc/[PID]/smaps – Bellek Haritası

# Sürecin bellek haritası
cat /proc/$PID/maps

# Daha detaylı bellek bilgisi (her segment için ayrı istatistik)
cat /proc/$PID/smaps

# Sürecin gerçek bellek kullanımı (PSS - Proportional Set Size)
grep -E "^(Pss|Private)" /proc/$PID/smaps | awk '{sum+=$2} END {print sum/1024 " MB"}'

/proc/[PID]/io – I/O İstatistikleri

cat /proc/$PID/io
# rchar: 1234567     (okunan toplam byte)
# wchar: 890123      (yazılan toplam byte)
# syscr: 456         (read syscall sayısı)
# syscw: 234         (write syscall sayısı)
# read_bytes: 102400  (diskten gerçekte okunan)
# write_bytes: 81920  (diske gerçekte yazılan)

/proc/[PID]/environ – Ortam Değişkenleri

# Sürecin ortam değişkenleri (dikkatli kullanın, hassas veri olabilir)
cat /proc/$PID/environ | tr '' 'n'

# Belirli bir değişkene bakmak
cat /proc/$PID/environ | tr '' 'n' | grep JAVA_HOME

/proc/[PID]/net – Ağ Bilgileri

# Sürecin network namespace'indeki TCP bağlantıları
cat /proc/$PID/net/tcp

# UDP bağlantıları
cat /proc/$PID/net/udp

# Ağ arayüzleri ve istatistikleri
cat /proc/$PID/net/dev

Ağ Bilgileri: /proc/net

# Tüm TCP bağlantıları (hex format)
cat /proc/net/tcp

# Ağ arayüzü istatistikleri
cat /proc/net/dev

# ARP tablosu
cat /proc/net/arp

# Routing tablosu
cat /proc/net/route

# Aktif bağlantı sayısını izle
watch -n1 'cat /proc/net/sockstat'

Pratik Monitoring Scriptleri

Şimdiye kadar öğrendiklerimizi bir araya getirelim. İşte /proc kullanan gerçek dünya monitoring örnekleri:

#!/bin/bash
# system_check.sh - /proc tabanlı hızlı sistem kontrolü

echo "=== SISTEM DURUMU ==="

# Uptime
echo -n "Uptime: "
awk '{s=int($1); printf "%dd %02d:%02d:%02dn", s/86400, (s%86400)/3600, (s%3600)/60, s%60}' /proc/uptime

# Load average
echo -n "Load: "
awk '{print $1, $2, $3}' /proc/loadavg

# Bellek kullanımı
echo "=== BELLEK ==="
awk '/MemTotal|MemAvailable|SwapFree|SwapTotal/ {printf "%-15s %d MBn", $1, $2/1024}' /proc/meminfo

# CPU sayısı
echo -n "CPU Core: "
grep -c "processor" /proc/cpuinfo

# En çok bellek kullanan 5 süreç
echo "=== TOP 5 BELLEK KULLANAN SURECLER ==="
for pid in /proc/[0-9]*/status; do
    p=$(echo $pid | cut -d/ -f3)
    name=$(grep "^Name:" $pid 2>/dev/null | awk '{print $2}')
    rss=$(grep "^VmRSS:" $pid 2>/dev/null | awk '{print $2}')
    [ -n "$rss" ] && echo "$rss $name (PID:$p)"
done | sort -rn | head -5 | awk '{printf "%s MB - %sn", $1/1024, $2}'

# Zombie süreç kontrolü
echo "=== ZOMBIE SURECLER ==="
zombies=$(grep -l "^State:.*Z" /proc/[0-9]*/status 2>/dev/null | wc -l)
echo "Zombie surecler: $zombies"
#!/bin/bash
# fd_monitor.sh - Dosya descriptor sızıntısı tespiti

echo "Acik dosya descriptor sayilarina gore top 10 surec:"
echo ""

for pid in /proc/[0-9]*/fd; do
    p=$(echo $pid | cut -d/ -f3)
    count=$(ls $pid 2>/dev/null | wc -l)
    name=$(cat /proc/$p/comm 2>/dev/null)
    echo "$count $name (PID:$p)"
done | sort -rn | head -10

/proc/sys ile Kernel Tuning

/proc/sys altındaki değerleri değiştirerek kernel davranışını anlık olarak tuning edebilirsiniz. Bu değerler /etc/sysctl.conf‘a kalıcı olarak da yazılabilir.

# Sistem genelinde dosya descriptor limiti
cat /proc/sys/fs/file-max
echo 2097152 > /proc/sys/fs/file-max

# TCP time-wait soketlerinin hızlı geri dönüşümü
cat /proc/sys/net/ipv4/tcp_tw_reuse

# OOM Killer agresifliği (vm.overcommit_memory)
cat /proc/sys/vm/overcommit_memory

# Dirty page threshold - yoğun disk I/O olan sistemler için
cat /proc/sys/vm/dirty_ratio
cat /proc/sys/vm/dirty_background_ratio

# Network buffer boyutları
cat /proc/sys/net/core/rmem_max
cat /proc/sys/net/core/wmem_max

/proc ile Güvenlik Kontrolleri

Güvenlik olaylarında /proc paha biçilmezdir:

# Ağ bağlantısı olan ama executable'ı silinmiş süreçler (rootkit belirtisi)
for pid in /proc/[0-9]*/exe; do
    p=$(echo $pid | cut -d/ -f3)
    target=$(readlink $pid 2>/dev/null)
    if [[ "$target" == *"(deleted)"* ]]; then
        echo "UYARI - Silinen executable: PID $p -> $target"
        cat /proc/$p/cmdline | tr '' ' '
        echo ""
    fi
done

# Şüpheli ortam değişkenleri olan süreçler
for pid in /proc/[0-9]*/environ; do
    p=$(echo $pid | cut -d/ -f3)
    if cat $pid 2>/dev/null | tr '' 'n' | grep -qE "LD_PRELOAD|LD_LIBRARY_PATH"; then
        name=$(cat /proc/$p/comm 2>/dev/null)
        echo "UYARI - LD_PRELOAD/LD_LIBRARY_PATH: PID $p ($name)"
    fi
done

LD_PRELOAD değişkeni olan süreçler, inject edilmiş shared library barındırıyor olabilir. Bu, rootkit ve trojan tespitinde önemli bir işarettir.

/proc Dosya Sisteminin Sınırlamaları

Her güçlü aracın olduğu gibi /proc‘un da sınırları ve dikkat edilmesi gereken noktaları var:

  • Race condition: /proc/[PID] dizini okurken süreç sonlanabilir. Her zaman 2>/dev/null ile hata yönetimi yapın
  • İzinler: Başka kullanıcılara ait süreçlerin bazı dosyalarını root olmadan okuyamazsınız
  • Anlık snapshot değil: Bir döngüde birden fazla dosya okuyorsanız değerler tutarsız olabilir
  • Hassas veri: environ ve cmdline dosyaları şifreler gibi hassas bilgiler içerebilir; izinlere dikkat edin
  • Kernel versiyonu: Bazı dosyalar yalnızca belirli kernel sürümlerinde bulunur

Sonuç

/proc dosya sistemi, Linux sistem yöneticiliğinin tam kalbinde yer alan bir yapıdır. top, ps, lsof, netstat gibi araçların neredeyse tamamı arka planda /proc‘u kullanır. Bu araçların sunduğu formatlı çıktıların ötesine geçmek istediğinizde, ham veriye ihtiyaç duyduğunuzda veya özel bir monitoring senaryosu kurguladığınızda doğrudan /proc‘a gitmekten çekinmeyin.

Özellikle şu durumlar için /proc alışkanlık haline getirilmeli:

  • Canlı sistemlerde performans sorunlarını araştırırken
  • Güvenlik olaylarında şüpheli süreç davranışını incelerken
  • Özel monitoring ve alerting scriptleri yazarken
  • Kernel parametrelerini anlık test ederken
  • “Too many open files” gibi kaynak sınırı sorunlarını teşhis ederken

En iyi yol: bugün bir test sisteminizde ls /proc çıktısına bakın ve merak ettiğiniz her dosyayı cat ile açın. Kernel size bir şeyler anlatmak istiyor, dinlemeniz yeterli.

Yorum yapın