Sunucuda bir şeylerin ters gittiğini hissediyorsun, log dosyası büyüyor, process sayısı artıyor ya da disk dolmaya başlıyor. Her seferinde aynı komutu tekrar tekrar çalıştırmak yerine, terminali açık bırakıp çıktının otomatik olarak yenilenmesini izlemek ne kadar güzel olurdu değil mi? İşte tam da bu ihtiyaç için watch komutu var. Basit görünüyor ama gerçek dünya senaryolarında inanılmaz derecede işe yarayan bir araç. Bu yazıda watch komutunu her yönüyle ele alacağız.
watch Komutu Nedir?
watch, belirttiğin bir komutu periyodik olarak çalıştırıp çıktısını terminal ekranında canlı olarak gösteren bir Linux aracıdır. Varsayılan olarak her 2 saniyede bir çalışır ve ekranı yeniler. Adını İngilizce “izlemek” kelimesinden alıyor ve tam olarak bunu yapıyor, bir komutu sürekli izlemene olanak tanıyor.
Pek çok sysadmin bu komutu ya hiç bilmez ya da var olduğunu bilip kullanmaz. Halbuki tail -f, top, htop gibi araçların yetersiz kaldığı pek çok durumda watch tam olarak ihtiyacın olan şeyi sunar.
watch komutu Procps paketinin bir parçasıdır ve neredeyse tüm Linux dağıtımlarında varsayılan olarak kurulu gelir. Eğer sisteminizde yoksa:
# Debian/Ubuntu tabanlı sistemler için
sudo apt install procps
# RHEL/CentOS/Rocky Linux için
sudo yum install procps-ng
# Arch Linux için
sudo pacman -S procps-ng
Temel Kullanım
En basit haliyle watch komutunu şöyle kullanırsın:
watch komut
Örnek olarak, sistemdeki disk kullanımını her 2 saniyede bir izlemek istiyorsan:
watch df -h
Bu komutu çalıştırdığında terminal ekranın tamamen değişir ve sağ üst köşede bir sayaç görürsün. Her 2 saniyede bir ekran yenilenir. Çıkmak için Ctrl+C tuş kombinasyonunu kullanırsın.
Temel Parametreler
-n, –interval: Yenileme aralığını saniye cinsinden belirler. Varsayılan değer 2 saniyedir.
-d, –differences: Bir önceki çıktıya göre değişen kısımları vurgular. Neyin değiştiğini hemen görürsün.
-h, –no-title: Üst başlık satırını gizler. Daha temiz bir görünüm sağlar.
-t, –no-title: Başlık satırını tamamen kaldırır, çıktı daha sade olur.
-b, –beep: Komut sıfır olmayan bir çıkış kodu döndürdüğünde uyarı sesi çıkarır.
-e, –errexit: Komut hata döndürdüğünde watch sonlanır.
-g, –chgexit: Çıktı değiştiğinde watch sonlanır. Script’lerde çok kullanışlıdır.
-c, –color: ANSI renk kodlarını destekler, renkli çıktıları doğru gösterir.
-x, –exec: Komutu shell üzerinden değil doğrudan çalıştırır.
-p, –precise: Komutun çalışma süresini hesaba katarak daha hassas zamanlama yapar.
-w, –no-linewrap: Uzun satırları kesmez, yatay kaydırma yerine keser.
Pratik Örnekler ve Gerçek Dünya Senaryoları
1. Disk Kullanımını İzleme
Bir backup scripti çalışıyor ve diskin dolup dolmadığını takip etmek istiyorsun. Her 5 saniyede bir disk durumunu izlemek için:
watch -n 5 df -h
Burada -n 5 parametresi yenileme aralığını 5 saniyeye çıkarır. Yoğun I/O durumlarında daha sık yenileme yapmak için 1 saniyeye düşürebilirsin:
watch -n 1 df -h /var
Sadece /var dizininin bulunduğu partition’ı izliyoruz. Log dosyaları burada toplandığında bu bilgi hayat kurtarır.
2. Değişimleri Vurgulayarak İzleme
-d parametresi gerçekten çok kullanışlı. Bir önceki çıktıya göre neyin değiştiğini anında görmeni sağlar:
watch -d -n 2 'ps aux | sort -k3 -rn | head -20'
Bu komut, CPU kullanımına göre sıralanmış process listesini izler ve değişen değerleri otomatik olarak vurgular. Bir process’in CPU kullanımı aniden artarsa hemen fark edersin.
3. Network Bağlantılarını İzleme
DDoS saldırısı şüphesi var ya da bir servise gelen bağlantıları takip etmek istiyorsun:
watch -n 1 -d 'ss -tuln | grep LISTEN'
Ya da aktif bağlantı sayısını port bazında görmek için:
watch -n 2 'ss -tn | awk "{print $5}" | cut -d: -f2 | sort | uniq -c | sort -rn | head -20'
Bu komut hangi porta kaç bağlantı geldiğini gösterir. Bir port aniden yüzlerce bağlantı almaya başlarsa -d parametresiyle bu değişimi anında görürsün.
4. Log Dosyasını Satır Sayısıyla İzleme
Bir web sunucusuna gelen istek sayısını gerçek zamanlı takip etmek istiyorsun:
watch -n 1 'wc -l /var/log/nginx/access.log'
Ya da belirli bir IP adresinin kaç istek attığını:
watch -n 2 'grep "192.168.1.100" /var/log/nginx/access.log | wc -l'
Tırmanan bir sayı görürsen hemen aksiyon alabilirsin.
5. Servis Durumunu Kontrol Etme
Yeni deploy ettiğin bir servisi izlemek, yeniden başlatma sürecini takip etmek ya da crash sonrası recover durumunu görmek için:
watch -n 3 'systemctl status nginx | head -20'
Eğer birden fazla servisi izlemek istersen:
watch -n 5 'systemctl status nginx postgresql redis | grep -E "(Active|●)"'
Bu komut üç servisin sadece aktif/pasif durumunu gösterir, gereksiz detayları filtreler.
6. Memory Kullanımını İzleme
Bir memory leak şüphen var ve belirli bir process’in RAM tüketimini takip etmek istiyorsun:
watch -n 1 -d 'ps aux | grep python | grep -v grep | awk "{print $6/1024" MB"}"'
Tüm sistemin memory durumunu izlemek için:
watch -n 2 free -h
Ya da daha detaylı bilgi için:
watch -n 2 'cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|Cached|Buffers)"'
7. Docker Container’larını İzleme
Docker ortamında çalışıyorsan container durumlarını ve kaynak kullanımını izlemek kritik önem taşır:
watch -n 2 docker ps --format "table {{.Names}}t{{.Status}}t{{.Ports}}"
Container’ların kaynak kullanımını görmek için (docker stats zaten canlı ama bazen pipeline’a sokmak gerekir):
watch -n 3 'docker stats --no-stream --format "table {{.Container}}t{{.CPUPerc}}t{{.MemUsage}}"'
8. Kubernetes Pod’larını İzleme
K8s ortamında deployment yapıyorsun ve pod’ların ayağa kalkmasını izlemek istiyorsun:
watch -n 2 kubectl get pods -n production
Belirli bir deployment’ı takip etmek için:
watch -n 3 'kubectl get pods -n production | grep my-app'
Bu senaryo özellikle rolling update sırasında çok işe yarıyor. Eski pod’ların düşüp yenilerinin ayağa kalktığını adım adım izleyebiliyorsun.
Gelişmiş Kullanım Teknikleri
Pipe ve Kompleks Komutlarla Kullanım
watch komutunu pipe ile birlikte kullandığında tırnak işaretlerine dikkat etmen gerekiyor. Bütün komut zincirini tırnak içine almalısın:
watch -n 1 'netstat -an | grep :80 | grep ESTABLISHED | wc -l'
Bu komut 80 portuna kaç aktif bağlantı olduğunu sayar. Web sunucusu yük testlerinde çok kullanışlı.
Renk Destekli Çıktılar
Bazı komutlar renkli çıktı üretir ama watch varsayılan olarak bunları düzgün göstermez. -c parametresiyle bu sorunu çözebilirsin:
watch -c -n 2 'ls --color=always -la /var/log'
Ya da git status gibi renkli çıktı veren komutlar için:
watch -c -n 5 'git log --oneline --color=always | head -10'
Çıktı Değişince Otomatik Çıkış
Script yazarken watch komutunun çıktı değişince durmasını isteyebilirsin. -g parametresi tam da bunun için:
watch -g -n 1 'systemctl is-active nginx'
Nginx servisi durduğunda ya da başladığında watch otomatik olarak sonlanır. Bunu bir script’te şöyle kullanabilirsin:
#!/bin/bash
echo "Deployment bekleniyor..."
watch -g -n 2 'kubectl get deployment my-app -o jsonpath="{.status.readyReplicas}"' 2>/dev/null
echo "Deployment durumu degisti, kontrol ediliyor..."
kubectl get deployment my-app
Hata Durumunda Çıkış
-e parametresiyle komut hata döndürdüğünde watch duraklayarak sana bilgi verir:
watch -e -n 2 'ping -c 1 192.168.1.1'
Host erişilemez olduğunda ekranda hata mesajı kalır ve bir tuşa basana kadar duraklar. Bu sayede critical bir durumu kaçırmazsın.
Başlık Satırını Kaldırma
Çıktıyı başka bir araçla pipe etmek ya da daha temiz görüntü istiyorsan:
watch -t -n 2 df -h
-t ile üstteki komut ve zaman bilgisini gösteren başlık satırı kaybolur.
watch Komutunu Script’lerde Kullanma
Bir Condition Beklemek
Backup tamamlanana kadar bekleyen bir script:
#!/bin/bash
TARGET_FILE="/backup/database_backup.sql.gz"
echo "Backup dosyasi bekleniyor: $TARGET_FILE"
# Dosya olusana kadar bekle
watch -g -n 5 "test -f $TARGET_FILE && echo 'TAMAMLANDI' || echo 'BEKLENIYOR'" 2>/dev/null
if [ -f "$TARGET_FILE" ]; then
echo "Backup basariyla tamamlandi!"
ls -lh "$TARGET_FILE"
else
echo "Backup basarisiz ya da iptal edildi."
fi
Process Tamamlanmasını Beklemek
Bir process’in bitmesini bekleyip sonrasında işlem yapan script:
#!/bin/bash
PID=$1
if [ -z "$PID" ]; then
echo "Kullanim: $0 <PID>"
exit 1
fi
echo "PID $PID izleniyor..."
watch -g -n 2 "ps -p $PID > /dev/null 2>&1 && echo 'CALISYOR' || echo 'DURDU'" 2>/dev/null
echo "Process $PID sonlandi, devam ediliyor..."
Alternatifler ve Karşılaştırma
watch her durumda en iyi araç değil. Neyi ne zaman kullanacağını bilmek önemli.
tail -f ile karşılaştırma: tail -f dosya sonuna eklenen yeni satırları anlık gösterir. Log izlemede tail -f daha iyidir çünkü eski satırlar kaybolmaz, scroll back yapabilirsin. Ama komut çıktısı izlemede watch çok daha uygun.
top ve htop: Sadece process izlemek için bunlar daha iyi arayüz sunar. Ama istediğin komutu izleyemezsin, sadece process’leri görürsün. watch ps ise istediğin filtreyi uygulayarak göstermenizi sağlar.
tmux pane’leri: Uzun süreli izleme için watch komutunu bir tmux pane’inde çalıştırmak en iyi yöntemdir. Oturumu kapatsan bile izlemeye devam eder.
# Yeni bir tmux session'da watch başlat
tmux new-session -d -s monitoring 'watch -n 2 df -h'
tmux new-window -t monitoring 'watch -n 1 free -h'
Yaygın Hatalar ve Dikkat Edilmesi Gerekenler
Tırnak işareti problemi: En sık yapılan hata, pipe veya özel karakterler içeren komutları tırnaksız yazmak:
# YANLIS - pipe watch tarafindan degil, shell tarafindan yorumlanir
watch ps aux | grep nginx
# DOGRU - tum komut tırnak icinde
watch 'ps aux | grep nginx'
Yüksek frekanslı izleme: -n 0.1 gibi çok kısa aralıklar sisteme yük bindirebilir. Özellikle disk I/O veya network sorguları yapan komutlarda dikkatli ol. Genellikle 1 saniye yeterlidir.
Root gerektiren komutlar: watch ile sudo gerektiren komutları çalıştırırken:
sudo watch -n 2 'cat /proc/net/dev'
# ya da
watch -n 2 'sudo ss -tulnp'
İkinci durumda sudoers’ta NOPASSWD ayarı olması gerekir, yoksa şifre sorar ve watch donakkalır.
Terminal boyutu: watch çıktıyı terminal boyutuna sığdırmaya çalışır. Çok uzun çıktılarda alt satırlar kesilebilir. Bu durumda head komutuyla sınırlamak mantıklı:
watch -n 2 'ps aux | head -30'
Günlük Hayatta En Çok Kullandığım Kombinasyonlar
Yıllar içinde sysadmin olarak en çok şu kombinasyonlara döndüm:
# Sunucu genel saglik kontrolu
watch -n 3 -d 'uptime; echo "---"; free -h; echo "---"; df -h | grep -v tmpfs'
# Aktif SSH oturumlarini izleme
watch -n 5 'who | sort'
# Cron job calisip calismadigi
watch -n 10 'tail -5 /var/log/cron'
# MySQL replikasyon durumu
watch -n 2 'mysql -e "SHOW SLAVE STATUSG" 2>/dev/null | grep -E "(Running|Seconds|Error)"'
# Nginx access log'una gelen son istekler
watch -n 1 'tail -5 /var/log/nginx/access.log'
Sonuç
watch komutu, sysadmin araç kutusunun en değerli ama en az takdir edilen elemanlarından biri. Syntax’ı son derece basit, öğrenmesi 5 dakika alıyor ama doğru yerde kullandığında saatlerce terminal başında manuel komut çalıştırma zahmetinden kurtarıyor.
Özellikle şu senaryolarda watch olmadan yaşamak zorlaşıyor: deployment izleme, disk dolma takibi, şüpheli network trafiği analizi, service recovery gözlemleme ve batch job ilerleme kontrolü.
Komutunu bir kez yaz, -n ile aralığını ayarla, -d ile değişimleri vurgula ve ekranın başından ayrıl. Bir şey değiştiğinde zaten göreceksin. Basit ama etkili, tam da iyi bir Unix aracının olması gerektiği gibi.
Eğer watch kullanmıyorsan, bugün bir kaç basit örnekle başla. Bir sonraki sunucu sorununda, o otomatik yenilenen ekrana bakıp “bunu neden daha önce kullanmadım” diyeceksin.