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,sedgibi 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 zaman2>/dev/nullile 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:
environvecmdlinedosyaları ş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.