watch Komutu ile Periyodik Komut Çıktısını Gerçek Zamanlı İzleme

Sunucu yönetiminde zamanın büyük bir kısmını terminal başında geçiriyorsanız, bir komutu tekrar tekrar çalıştırıp çıktısını karşılaştırma ihtiyacını mutlaka yaşamışsınızdır. Disk doluluk oranı değişiyor mu? Bir process’in bellek tüketimi artıyor mu? O log dosyası büyümeye devam ediyor mu? İşte tam bu anlarda watch komutu hayat kurtarıcı olur.

watch, temel olarak bir komutu belirli aralıklarla çalıştırıp çıktısını sürekli güncelleyen bir yardımcı programdır. Ama bu basit tanım, aracın gerçek değerini yeterince yansıtmıyor. Doğru parametrelerle kullanıldığında ciddi bir monitoring aracına dönüşebiliyor.

Temel Kullanım ve Sözdizimi

watch komutunun genel sözdizimi şu şekildedir:

watch [seçenekler] komut

En basit kullanımıyla bir örnek verelim. Sunucunun anlık yük ortalamasını her iki saniyede bir görmek istiyorsunuz:

watch uptime

Bu kadar. Terminal ekranınız artık her iki saniyede bir uptime komutunun çıktısıyla yenilenecek. Ekranın üst kısmında ne kadar sıklıkla yenilendiği, mevcut tarih/saat ve çalıştırılan komut görünür. Çıkmak için q veya Ctrl+C tuş kombinasyonunu kullanabilirsiniz.

Peki ya daha karmaşık komutlar? watch komutu, verdiğiniz ifadeyi shell’e değil, doğrudan sisteme gönderiyor. Bu önemli bir detay. Pipe, yönlendirme veya özel shell değişkenleri kullanmak istiyorsanız bunu göz önünde bulundurmak gerekiyor.

watch "df -h | grep /dev/sda"

Pipe içeren komutları tırnak içine almanız gerekiyor. Yoksa watch sadece df -h komutunu çalıştırır ve pipe’ı işlemez.

Temel Parametreler

-n, –interval: Yenileme aralığını saniye cinsinden belirler. Varsayılan değer 2 saniyedir.

-d, –differences: Önceki çıktıya göre değişen kısımları vurgular. Neyin değiştiğini hemen görürsünüz.

-d=cumulative: Tüm değişimleri birikimli olarak vurgular. O oturumda değişmiş olan her şey işaretli kalır.

-t, –no-title: Üst başlık çubuğunu gizler. Çıktıyı başka bir araçla işleyecekseniz veya ekranı tam kullanmak istiyorsanız kullanışlıdır.

-b, –beep: Komut sıfırdan farklı bir çıkış kodu döndürdüğünde uyarı sesi çalar.

-e, –errexit: Komut hata döndürdüğünde watch otomatik olarak durur.

-g, –chgexit: Çıktı değiştiğinde watch otomatik olarak durur. Bir değişimi bekliyorsanız son derece kullanışlı.

-c, –color: ANSI renk kodlarını yorumlar. Bazı komutlar renk çıktısı üretir ama watch bunu varsayılan olarak düz metin gibi gösterir. Bu parametre ile renkler korunur.

-x, –exec: Komutu shell üzerinden değil doğrudan çalıştırır. Hafif performans avantajı sağlar.

-p, –precise: Her çalıştırma tam olarak belirtilen aralıkta yapılmaya çalışılır. Komutun çalışma süresi hesaba katılır.

Yenileme Aralığını Özelleştirmek

Varsayılan 2 saniyelik aralık her zaman uygun değildir. Bazen daha sık, bazen daha seyrek yenileme isteyebilirsiniz:

# Her 5 saniyede bir yenile
watch -n 5 "netstat -an | grep ESTABLISHED | wc -l"

# Her 0.5 saniyede bir yenile (çok yüksek frekanslı izleme)
watch -n 0.5 "cat /proc/loadavg"

# Her 60 saniyede bir yenile (düşük frekanslı izleme)
watch -n 60 "free -h"

Dikkat: Çok kısa aralıklar (0.1 saniye gibi) sistem üzerinde gereksiz yük oluşturabilir. Özellikle watch içinde ağ çağrısı yapan komutlar çalıştırıyorsanız bu konuda dikkatli olun.

Değişim Vurgulama: -d Parametresinin Gücü

-d parametresi benim en çok kullandığım özellik. Neyin değiştiğini anında görmenizi sağlıyor. Mesela aktif bağlantı sayısını izleyelim:

watch -d "ss -s"

Yeni bir bağlantı açıldığında veya kapandığında, değişen değerler tersine çevrilmiş renkte (genellikle koyu arka plan üzerinde) gösterilir. Büyük çıktılarda neyin değiştiğini elle aramak yerine gözünüz doğrudan değişime kayar.

Birkaç dakika boyunca tüm değişimlerin birikimli olarak görünmesini istiyorsanız:

watch -d=cumulative "cat /proc/net/dev"

Bu özellikle ağ arayüzü istatistiklerini takip ederken, hangi sayaçların aktif olarak değiştiğini anlamak için çok işe yarıyor.

Gerçek Dünya Senaryoları

Disk Kullanımını İzleme

Disk doluluğu kritik bir serviste sorun yaratmadan önce fark etmek istiyorsunuz. Sıradan df -h yerine:

watch -n 10 -d "df -h | grep -v tmpfs"

Geçici dosya sistemlerini filtreleyerek sadece gerçek diskleri gösteriyoruz ve 10 saniyede bir yeniliyoruz. -d parametresi sayesinde değişen değerler anında göze çarpıyor.

Daha spesifik bir senaryoda bir dizinin büyümesini takip etmek için:

watch -n 5 "du -sh /var/log/nginx/ && ls -lh /var/log/nginx/ | tail -5"

Bu komut hem dizinin toplam boyutunu hem de en son 5 dosyayı gösterir. Log dosyaları beklenmedik şekilde büyümeye başlarsa hemen fark edersiniz.

Süreç İzleme

Belirli bir process’in kaynak tüketimini izlemek için:

watch -n 2 -d "ps aux | grep nginx | grep -v grep"

Ya da bir process’in bellek tüketimini daha odaklı izlemek istiyorsanız, PID’i önceden öğrenip şöyle yapabilirsiniz:

# Önce PID'i öğren
PID=$(pgrep -f "java -jar myapp")

# Sonra izle
watch -n 3 "cat /proc/$PID/status | grep -E 'VmRSS|VmSize|Threads'"

Burada küçük bir trick var: -n ile shell değişkenlerini doğrudan watch içinde kullanamazsınız çünkü watch komutu shell ortamınıza erişemiyor. PID’i başka bir yerde hesaplayıp komuta gömelisiniz ya da /proc/$(pgrep java)/status gibi bir yaklaşım deneyebilirsiniz.

Ağ Bağlantılarını Takip Etme

Web sunucusuna gelen bağlantıların durumunu izlemek için:

watch -n 2 "ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn"

Bu komut TCP bağlantı durumlarını sayarak sıralar. Anormal miktarda TIME_WAIT veya CLOSE_WAIT durumu görürseniz bir sorun olduğunu anlarsınız.

DDoS veya ani trafik artışı şüphesi varsa belirli bir porta gelen bağlantıları sayabilirsiniz:

watch -n 1 -d "ss -tan | grep ':80' | grep ESTABLISHED | wc -l"

Servis Sağlık Kontrolü

Bir uygulamanın health endpoint’ini periyodik olarak sorgulamak:

watch -n 5 -b "curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/health"

Burada -b parametresi devreye giriyor. Eğer HTTP kodu 200 dışında bir şey dönerse (yani curl sıfırdan farklı çıkış kodu verirse) terminal uyarı sesi çalar. Gece yarısı bir deployment sonrası ekranı izlerken kullanışlı bir güvenlik ağı.

Log Dosyası Boyutu Takibi

Bir uygulamanın log üretim hızını takip etmek:

watch -n 5 "wc -l /var/log/myapp/application.log && stat -c '%y %s' /var/log/myapp/application.log"

Bu komut hem satır sayısını hem de son değiştirilme zamanını ve dosya boyutunu gösterir. Log üretimi anormal derecede hızlanırsa hemen fark edersiniz.

Sistem Kaynakları Genel Bakış

top veya htop kullanmak istemediğiniz durumlarda, özel bir görünüm oluşturabilirsiniz:

watch -n 2 -d "echo '=== CPU ===' && cat /proc/loadavg && echo '=== Memory ===' && free -h && echo '=== Disk I/O ===' && iostat -x 1 1 | tail -5"

Bu biraz uzun görünüyor ama gerçekte çok işlevli bir dashboard oluşturuyor. Tek ekranda CPU yükü, bellek ve disk I/O bilgisini bir arada görüyorsunuz.

watch ile Birleştirilebilecek Kullanışlı Komutlar

watch kendi başına güçlü bir araç ama bazı komutlarla özellikle iyi çalışıyor:

# Aktif MySQL/MariaDB sorgu sayısını izle
watch -n 3 "mysqladmin -u root -p'parola' processlist 2>/dev/null | grep -v Sleep | wc -l"

# Docker container kaynak kullanımı (tek seferlik çıktı olarak)
watch -n 5 "docker stats --no-stream --format 'table {{.Name}}t{{.CPUPerc}}t{{.MemUsage}}'"

# Kubernetes pod durumları
watch -n 10 "kubectl get pods -n production"

# Sistem çağrısı istatistikleri
watch -n 2 -d "cat /proc/stat | grep cpu"

Docker örneğinde --no-stream parametresi kritik. docker stats normalde kendi stream modunda çalışır. --no-stream ile tek seferlik çıktı alıyoruz, watch bu çıktıyı alıp yenileme döngüsüne sokuyor.

Renk Desteği ile Daha Okunabilir Çıktılar

Bazı komutlar renk üretir ama watch varsayılan olarak ANSI renk kodlarını yorumlamaz. -c parametresi burada devreye girer:

watch -c -n 3 "kubectl get pods -n production --no-headers | awk '{
    if ($3 == "Running") print "33[32m" $0 "33[0m";
    else if ($3 == "Pending") print "33[33m" $0 "33[0m";
    else print "33[31m" $0 "33[0m"
}'"

Bu komut Kubernetes pod’larını durumuna göre renklendirerek gösterir. Running pod’lar yeşil, Pending olanlar sarı, diğerleri kırmızı görünür.

Değişim Algılama ile Otomasyon: -g Parametresi

-g veya --chgexit parametresi, çıktı değiştiğinde watch‘u otomatik olarak sonlandırır. Bu özelliği shell scriptleri içinde oldukça işlevsel şekillerde kullanabilirsiniz:

# Bir deployment tamamlanana kadar bekle
watch -g -n 5 "kubectl rollout status deployment/myapp -n production"
echo "Deployment tamamlandi, devam ediliyor..."

# Bir dosya oluşturulana kadar bekle
watch -g -n 2 "ls /tmp/deployment-complete.flag 2>/dev/null"
echo "Flag dosyasi bulundu"

Bu yaklaşım bir CI/CD pipeline içinde deployment’ın tamamlanmasını beklerken çok kullanışlı. Tabii daha sofistike çözümler için kubectl wait gibi özel araçlar mevcut, ama watch -g basit senaryolar için gayet yeterli.

Yaygın Sorunlar ve Çözümleri

Ekran kırpılma sorunu: Komut çıktısı terminal genişliğini aşarsa watch çıktıyı kesiyor. Bu durumda terminal penceresini büyütmek veya çıktıyı filtreleyen bir komutla birleştirmek gerekiyor.

Shell değişkenleri çalışmıyor: watch içinde $VARIABLE kullanmak istiyorsanız ve bu değişken mevcut shell’inizde tanımlıysa:

# Bu çalışmaz
watch "echo $MY_VAR"

# Bu çalışır (değer anında genişletilir)
watch "echo $(echo $MY_VAR)"

# Ya da değeri doğrudan gömin
watch "echo sabit_deger"

Alias’lar çalışmıyor: Shell alias’larınız watch içinde tanınmıyor. Doğrudan tam komut yolunu veya gerçek komutu kullanmanız gerekiyor. Örneğin ll alias’ınız varsa watch ll yerine watch "ls -la" yazmalısınız.

Yüksek CPU kullanımı: Çok kısa aralıklarla çalıştırılan ağır komutlar ciddi CPU tüketimine yol açabilir. watch -n 0.1 "find / -name '*.log'" gibi bir şey yazmayın. Yenileme aralığını komutun ortalama çalışma süresinden büyük tutun.

watch ve tmux/screen Kombinasyonu

watch komutunu tmux ile birleştirdiğinizde gerçek bir monitoring setup’ı oluşturabilirsiniz. Birden fazla pane’de farklı watch komutları çalıştırarak kendi dashboard’unuzu yaratabilirsiniz:

# Yeni tmux session
tmux new-session -d -s monitoring

# Pane'leri böl ve watch komutlarını başlat
tmux split-window -h
tmux split-window -v

# Her pane'e komut gönder
tmux send-keys -t monitoring:0.0 'watch -n 2 -d "free -h"' Enter
tmux send-keys -t monitoring:0.1 'watch -n 5 "df -h | grep -v tmpfs"' Enter
tmux send-keys -t monitoring:0.2 'watch -n 2 -d "ss -s"' Enter

# Session'a bağlan
tmux attach-session -t monitoring

Bu setup ile sistem kaynaklarını birden fazla pencerede eş zamanlı izleyebilirsiniz. SSH oturumunuz kesilse bile tmux session’ı arka planda çalışmaya devam eder.

procps-ng ve Eski Sürüm Farkları

watch komutu genellikle procps veya procps-ng paketi ile geliyor. Bazı eski sistemlerde -d, -b, -g gibi parametreler mevcut olmayabilir. Sürümü kontrol etmek için:

watch --version

Eğer çok eski bir sürüm görüyorsanız ve modern özelliklere ihtiyacınız varsa, paketi güncellemek ya da alternatif olarak entr veya basit bir shell döngüsü kullanmak düşünülebilir:

# watch alternatifi: basit shell döngüsü
while true; do
    clear
    date
    df -h | grep -v tmpfs
    sleep 10
done

Bu yöntem daha az özellikli ama her sistemde çalışır.

Sonuç

watch, çok basit görünen ama doğru kullanıldığında monitoring iş akışını ciddi ölçüde hızlandıran bir araç. Özellikle -d ile değişim vurgulama, -g ile değişim algılama ve -b ile uyarı sesi özelliklerini birleştirdiğinizde, karmaşık izleme scriptleri yazmaya gerek kalmadan birçok senaryoyu halledebiliyorsunuz.

Deployment takibi, kaynak izleme, log büyümesi kontrolü, servis sağlık kontrolü gibi günlük işlerde terminal başına geçirilen süreyi önemli ölçüde azaltıyor. Üstelik sıfır bağımlılık, her Linux sistemde hazır.

Grafana, Prometheus gibi ağır monitoring stack’lere ihtiyaç duymadan, anlık bir durumu hızlıca takip etmek istediğinizde watch her zaman ilk tercih olmalı. Basit tutun, ama değerini küçümsemeyin.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir