watch Komutu ile Dosya Sistemi Değişikliklerini Gerçek Zamanlı İzleme

Birçok sysadmin arkadaşımın gözden kaçırdığı küçük ama son derece güçlü bir araçtan bahsedeceğim bugün. Sunucuda bir şeyler olurken terminali bırakmadan izlemek, özellikle gece yarısı bir prodüksiyon sorunu varken hayat kurtarıcı oluyor. watch komutu tam da bu işe yarıyor, ama çoğu kişi onu yalnızca watch df -h gibi basit kullanımlara indirgiyor. Oysaki biraz yaratıcılıkla dosya sistemi değişikliklerini gerçek zamanlı takip etmek için oldukça etkili bir araç haline geliyor.

watch Komutu Nedir, Ne İşe Yarar?

watch, belirttiğiniz herhangi bir komutu belirli aralıklarla tekrar tekrar çalıştıran ve çıktısını terminal ekranında güncelleyen bir araçtır. Çoğu Linux dağıtımında procps paketinin bir parçası olarak gelir, dolayısıyla ek kurulum gerektirmez.

Temel mantığı şu: siz bir komut yazarsınız, watch onu varsayılan olarak her 2 saniyede bir çalıştırır ve ekranı günceller. Bu sayede komutun çıktısındaki değişiklikleri anlık olarak görebilirsiniz.

Temel sözdizimi şöyledir:

watch [seçenekler] komut

Sık kullanılan parametreler şunlar:

  • -n [saniye]: Güncelleme aralığını belirler. Varsayılan 2 saniyedir
  • -d: Değişen kısımları vurgular (highlight). Önceki çıktıdan farklı olan alanları ekranda belirginleştirir
  • -t: Başlık satırını gizler. Script çıktısına yönlendirirken işe yarar
  • -b: Komut sıfırdan farklı bir çıkış kodu döndürürse bip sesi çıkarır
  • -e: Komut hata verirse güncellemeyi durdurur ve ekranda bekler
  • -g: Çıktı değiştiğinde watch otomatik olarak sonlanır
  • -c: ANSI renk kodlarını işler, renkli çıktıları doğru gösterir
  • -x: Komutu exec ile çalıştırır, shell üzerinden değil. Bazı performans avantajları sağlar

Dosya Sistemi İzleme: Neden watch Kullanmalıyız?

Aslında inotifywait gibi daha “doğru” araçlar var bu iş için. Ama watch ile yapılan izleme, kurulum gerektirmiyor, her sunucuda çalışıyor ve anlık durum raporlaması için yeterince iyi. inotify olay bazlı çalışırken, watch anlık fotoğraf çekiyor ve iki fotoğraf arasındaki farkı gösteriyor. Her birinin kendine göre yeri var.

Tipik kullanım senaryoları şunlar:

  • Log dosyalarının boyutunu ve satır sayısını izlemek
  • Bir dizine dosya gelip gelmediğini kontrol etmek
  • Disk doluluk oranını takip etmek
  • İnode kullanımını izlemek
  • Geçici dosyaların birikip birikmediğini görmek
  • Bir deployment sırasında dosyaların yerlerine gidip gitmediğini takip etmek

Pratik Kullanım Örnekleri

1. Dizin İçeriğini Anlık İzleme

En basit ama en kullanışlı senaryo. Bir dizine dosya gelip gelmediğini izlemek istiyorsunuz:

watch -d -n 1 'ls -lh /var/spool/mail/'

Burada -d parametresi değişen satırları vurguluyor, -n 1 ise her saniye güncelleme yapıyor. Bir mail geldiğinde yeni satır belirginleşiyor. Deployment sürecinde /opt/uygulama/uploads/ gibi bir dizini izlerken bu çok işe yarıyor.

watch -d -n 2 'ls -lht /tmp/ | head -20'

Bu komut /tmp dizinindeki en son değişen 20 dosyayı zaman sırasına göre listeler. Bir uygulama hata ayıklarken geçici dosya oluşturursa anında görürsünüz.

2. Disk Kullanımını Gerçek Zamanlı Takip

Disk doluluk alarmı aldınız, hangi dizin şişiyor bulmak istiyorsunuz:

watch -d -n 5 'df -h | grep -v tmpfs'

tmpfs satırlarını atlıyoruz çünkü onlar zaten bellekte, gerçek disk kullanımını görmek istiyoruz. -n 5 ile 5 saniyede bir güncelleme yeterli bu senaryo için.

Daha spesifik bir dizini izlemek için:

watch -d -n 3 'du -sh /var/log/* | sort -rh | head -15'

Bu komut /var/log altındaki dizinleri boyuta göre sıralar. Hangi log patlamış, bir bakışta anlaşılıyor.

3. Log Dosyası Değişikliklerini İzleme

tail -f zaten bu iş için var diyeceksiniz, haklısınız. Ama bazen log satırlarını değil, log dosyasının boyutunu veya değişip değişmediğini izlemek istiyorsunuz:

watch -d -n 2 'stat /var/log/nginx/error.log | grep -E "Size|Modify"'

Bu komut Nginx error log dosyasının boyutunu ve son değiştirilme zamanını izler. Dosya büyüyorsa Size alanı değişiyor ve -d parametresi sayesinde o kısım ekranda vurgulanıyor.

Birden fazla log dosyasını aynı anda izlemek için:

watch -d -n 3 'for f in /var/log/nginx/*.log; do echo "$(stat -c "%n %s bytes - %y" $f)"; done'

Bu döngü Nginx dizinindeki tüm log dosyalarının adını, boyutunu ve son değiştirilme zamanını listeler.

4. İnode Kullanımını İzleme

“Disk doluymuş” diyor ama df -h boş alan gösteriyor. İnode’lar tükenmişte bu! Bu klasik sorunu izlemek için:

watch -d -n 10 'df -i | grep -v tmpfs'

Eğer IUse% sütunu %90’ı geçiyorsa sorun orada. Genellikle /tmp altında ya da mail spool’da binlerce küçük dosya birikmiş olur.

5. Belirli Bir Süreçin Dosya Aktivitesini İzleme

Bir process’in açık tuttuğu dosyaları izlemek istiyorsunuz. lsof ile kombinasyon:

watch -d -n 2 'lsof -p $(pgrep -f uygulama_adi) | grep -v "^COMMAND" | wc -l'

Bu komut belirttiğiniz sürecin açık tuttuğu dosya sayısını izler. Sayı sürekli artıyorsa file descriptor leak var demektir. Bu sorunu production’da yakalamak için bu yöntemi birkaç kez kullandım.

Daha detaylı versiyonu:

watch -d -n 3 'lsof -p $(pgrep -f java) 2>/dev/null | grep -E "REG|DIR" | awk "{print $9}" | sort | uniq -c | sort -rn | head -10'

Java uygulamasının en çok eriştiği dosyaları ve dizinleri gösterir. Memory leak veya log şişmesi araştırırken kullanışlı.

6. Dosya Sayısını İzleme

Bir klasöre gelen dosyaları sayarak izlemek için:

watch -d -n 1 'find /data/incoming/ -type f | wc -l'

Bir dosya transfer işlemi sırasında bunu çalıştırırsanız sayacın nasıl arttığını görürsünüz. Aynı zamanda işlemin takıldığı anları da (sayacın durduğu anlar) fark edebilirsiniz.

Belirli uzantılı dosyaları saymak için:

watch -d -n 2 'find /var/spool/cups/ -name "*.pdf" -type f | wc -l'

Yazıcı kuyruğunu izlemek için kullandığım bir yöntem bu. Print job’lar beklenenden uzun sürüyorsa bu komutla kuyrukta ne kadar iş kaldığını anlık görebiliyorsunuz.

7. Birleşik Dosya Sistemi Durumu Raporu

Birkaç komutu birleştirerek kapsamlı bir izleme panosu oluşturabilirsiniz:

watch -d -n 5 '
echo "=== DISK KULLANIMI ===";
df -h | grep -v tmpfs;
echo "";
echo "=== /var/log BOYUTLARI ===";
du -sh /var/log/* 2>/dev/null | sort -rh | head -5;
echo "";
echo "=== SON DEGISEN DOSYALAR ===";
find /var/log -newer /tmp/.ref_file -type f 2>/dev/null | head -10;
'

Bu komutu çalıştırmadan önce /tmp/.ref_file referans dosyasını oluşturmanız gerekiyor:

touch /tmp/.ref_file

Böylece bu referans dosyasından sonra değişen logları görebilirsiniz.

Değişiklikleri Vurgulamak: -d Parametresinin Gücü

-d parametresi watch komutunu gerçekten kullanışlı kılan şey. Önceki çıktıyla mevcut çıktıyı karşılaştırıp değişen kısımları ters video (reverse video) olarak gösteriyor. Yani beyaz zemin üstünde siyah metin yerine siyah zemin üstünde beyaz metin oluyor o kısım.

Özellikle ls -l gibi uzun listelerde hangi satırın değiştiğini tek bakışta anlıyorsunuz. Bu özelliği olmasa watch çok daha az kullanışlı olurdu.

watch -d -n 1 'ls -la /etc/nginx/conf.d/'

Nginx konfigürasyon dizinini izlerken birisi bir konfig dosyası eklerse veya değiştirirse anında görürsünüz. Birden fazla kişinin aynı sunucuda çalıştığı ortamlarda kim ne değiştiriyor takip etmek için pratik.

Gerçek Dünya Senaryosu: Deployment İzleme

Bir web uygulaması deployment’ı sırasında dosyaların doğru yerlere gidip gitmediğini izlemek istediğinizi düşünelim. Deployment script’i çalışırken paralel bir terminalde şunu açıyorum:

watch -d -n 2 '
echo "=== UYGULAMA DOSYALARI ===";
ls -lh /opt/myapp/releases/ | tail -5;
echo "";
echo "=== SYMLINK DURUMU ===";
ls -la /opt/myapp/current;
echo "";
echo "=== PROCESS SAYISI ===";
pgrep -c -f "myapp" || echo "Process yok";
echo "";
echo "=== PORT DURUMU ===";
ss -tlnp | grep ":8080" || echo "Port dinlenmiyor";
'

Bu komut:

  • Son 5 release dizinini gösteriyor
  • current symlink’inin nereye işaret ettiğini gösteriyor
  • Uygulama process sayısını gösteriyor
  • 8080 portunun dinlenip dinlenmediğini gösteriyor

Deployment tamamlandığında symlink değişiyor ve process başlıyor. Hepsini tek ekrandan izleyebiliyorsunuz.

Gerçek Dünya Senaryosu: Log Patlaması Tespiti

Bir gece df -h %95 uyarısı geldi. Hangi log şişiyor bulmak için:

watch -d -n 3 'du -sh /var/log/*/ 2>/dev/null | sort -rh | head -10'

3 saniyede bir güncelleniyor, hangi dizinin boyutu artıyor, onu yakalıyorsunuz. Ardından o servise geçip logrotate durumunu kontrol ediyorsunuz. Genellikle logrotate config’i eksik ya da servis yeniden başlatılmadan logrotate çalışmış oluyor (bazı servisler postrotate scriptlerine ihtiyaç duyuyor).

watch ile Script Oluşturma

watch çıktısını bir dosyaya kaydetmek doğrudan mümkün değil, ama bir script ile zamanlı snapshot alabilirsiniz. Alternatif olarak şunu yapabilirsiniz:

watch -t -n 5 'df -h' > /tmp/disk_log.txt

-t bayrağı başlık satırını kaldırıyor, çıktı daha temiz oluyor. Ama bu yöntemde dikkatli olun, watch ekran temizleme karakterleri de yazıyor olabilir. Gerçek anlamda loglama için while döngüsü daha doğru:

while true; do
  echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===";
  df -h | grep -v tmpfs;
  sleep 60;
done >> /var/log/disk_monitor.log

Dikkat Edilmesi Gereken Noktalar

Aralık değeri: -n 0.1 gibi çok küçük değerler vermeyin. Hem CPU kullanımını artırır hem de bazı komutlar (özellikle find veya du) tamamlanmadan yeni çağrı başlayabilir. Dosya sistemi izlemesi için 2-5 saniye genellikle yeterli.

Karmaşık komutlar için tırnak: Birden fazla kelimeden oluşan komutları tek tırnak içine alın. Özellikle pipe ve değişken kullandığınızda tırnak önemli:

watch -d 'ls -lh /var/log | grep ".log$"'

Shell değişkenleri: watch komutu shell değişkenlerini farklı yorumlar. Değişken kullanmak istiyorsanız dikkatli olun:

DIR="/var/log/nginx"
watch -d "ls -lh $DIR"

Çift tırnak kullandığınızda değişken expand ediliyor. Tek tırnak kullandığınızda literal olarak geçiyor.

Uzun süren komutlar: find / veya du -sh / gibi büyük dosya sistemlerini tarayan komutlar için güncelleme aralığını uzun tutun. 30 saniye veya 1 dakika mantıklı olabilir. Aksi hâlde komut bitmeden yenisi başlar ve sistem üzerinde gereksiz yük oluşur.

inotifywait ile Karşılaştırma

watch anlık durum gösterimi için harikayken, gerçek zamanlı olay yakalama için inotifywait daha doğru araç. Karşılaştırmak gerekirse:

  • watch ls /dizin: Her 2 saniyede dizin içeriğinin fotoğrafını çeker
  • inotifywait -m /dizin: Dizinde herhangi bir değişiklik anında bildirir, hiç gecikme olmaz

Sunucuya inotify-tools kurulamayanlar veya hızlıca bir şeyler izlemek isteyenler için watch mükemmel bir alternatif. Kurumsal ortamlarda paket yükleme için onay süreci gerektiren yerlerde watch kurtarıcı oluyor.

Kısa İpuçları

  • Ctrl+C ile watch‘ı durdurabilirsiniz
  • watch çalışırken ekranda gezinme yapılamaz, çıktı sabit bir şablonda güncellenir
  • Çıktı terminal genişliğini aşarsa kesilebilir. COLUMNS değişkenini ayarlayarak bunu kontrol edebilirsiniz
  • watch --differences=cumulative seçeneği ile tüm değişmiş alanları (sadece son iterasyona göre değil, başlangıçtan bu yana) vurgulayabilirsiniz, bu bazı dağıtımlarda --differences=permanent olarak da geçer
  • Renk destekli çıktılar için -c bayrağını unutmayın: watch -c -n 2 'ls --color=always /var/log'

Sonuç

watch komutu, adı kadar sade ve işlevi kadar güçlü bir araç. Dosya sistemi değişikliklerini izlemek için özel bir daemon kurmadan, ek bağımlılık yüklemeden, anlık görünürlük sağlıyor. Deployment takibi, log izleme, disk doluluk tespiti gibi günlük sysadmin işlerinde bu komutu ne kadar çok kullandığımı fark ettiğimde, neden bu kadar az konuşulduğunu merak ettim.

Temel kullanımının ötesine geçip -d ile değişiklikleri vurgulama, birden fazla komutu birleştirme ve uygun güncelleme aralıklarını seçme konusunda biraz pratik yaptığınızda, watch sizin de vazgeçilmezlerinizden biri hâline gelecek. Bir dahaki sefer bir şeyleri izlemek için ekrana defalarca ls veya df yazarken duraksayın ve watch ile yapabilir misiniz diye sorun kendinize. Büyük ihtimalle cevabınız evet olacak.

Bir yanıt yazın

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