Büyük bir tar arşivi oluştururken ya da sıkıştırma işlemi başlatırken ekrana bakıp “acaba bitiyor mu bitmeyecek mi” diye beklediğiniz oldu mu? Terminal donmuş gibi duruyor, hiçbir çıktı yok, disk ışığı yanıp sönüyor ama ne kadar süreceğini bilmiyorsunuz. İşte tam bu noktada pv komutu hayatınızı kurtarıyor.
pv (Pipe Viewer), bir boru hattından geçen veriyi izlemenizi sağlayan, küçük ama son derece güçlü bir araçtır. Özellikle arşivleme ve sıkıştırma işlemlerinde tar, gzip, bzip2, xz gibi komutlarla birlikte kullanıldığında size gerçek zamanlı ilerleme bilgisi, aktarım hızı ve tahmini bitiş süresi verir. Sunucu yönetiminde bu bilgiler, bir operasyonun kontrolden çıkıp çıkmadığını anlamak için kritik öneme sahiptir.
pv Nedir ve Nasıl Çalışır
pv, standart girişten (stdin) okuduğu veriyi standart çıkışa (stdout) yazarken bu veri akışını ölçer ve raporlar. Yani normal bir pipeline’a transparan biçimde oturur; diğer komutlar pv‘nin varlığından habersizdir. Tek yaptığı geçen veriyi saymak ve bunu ekrana bildirmektir.
Kurulum oldukça basittir:
# Debian/Ubuntu
sudo apt install pv
# RHEL/CentOS/AlmaLinux
sudo dnf install pv
# Arch Linux
sudo pacman -S pv
# macOS (Homebrew)
brew install pv
Temel kullanım mantığını anlamak için önce basit bir örneğe bakalım:
# Büyük bir dosyayı kopyalarken ilerlemeyi izleme
pv /home/backup/buyuk_dosya.tar | cat > /mnt/nas/buyuk_dosya.tar
Bu komut çalışırken terminalde şöyle bir çıktı görürsünüz:
512MiB 0:00:45 [11.4MiB/s] [=======> ] 51% ETA 0:00:43
Bu satırda sırasıyla şunlar var: aktarılan veri miktarı, geçen süre, anlık hız, ilerleme çubuğu, tamamlanma yüzdesi ve tahmini kalan süre. Tek satırda bu kadar bilgi, büyük operasyonlarda gerçekten paha biçilmez.
Temel pv Parametreleri
pv komutunun en sık kullanılan parametrelerine bakalım:
- -p: İlerleme çubuğunu gösterir (varsayılan olarak etkindir)
- -t: Geçen süreyi gösterir
- -e: Tahmini bitiş süresini (ETA) gösterir
- -r: Anlık aktarım hızını gösterir
- -b: Toplam aktarılan byte miktarını gösterir
- -n: Sayısal çıktı verir, ilerleme çubuğu yerine yüzde sayısı yazar (dialog veya zenity ile kullanım için)
- -s: Toplam boyutu manuel olarak belirtir (pipe’dan geçen verinin boyutu bilinmiyorsa)
- -W: İlk byte gelene kadar bekleme modunda kalır, o ana kadar durum göstermez
- -L: Aktarım hızını sınırlandırır (byte/saniye olarak), sunucu yükünü kontrol etmek için kullanışlıdır
- -q: Sessiz mod, herhangi bir durum çıktısı vermez
- -f: Çıktıyı stdout yerine stderr’e yönlendirir
tar ile Birlikte Kullanım
tar komutu kendi başına ilerleme göstermez. Büyük dizinleri arşivlerken pv‘yi pipeline’a eklemek bu sorunu çözer.
Arşiv Oluştururken İlerlemeyi İzleme
# Klasik yöntem: tar çıktısını pv üzerinden geçirme
tar -cf - /var/www/html | pv | gzip > /backup/web_backup_$(date +%Y%m%d).tar.gz
Burada tar -cf - komutu arşivi stdout’a yazar, pv bu veriyi izleyerek ekrana basar, gzip ise sıkıştırır. Ancak bu yöntemde pv toplam boyutu bilmediği için yüzde ve ETA gösteremez. Sadece hız ve geçen süreyi gösterir.
Boyut bilgisi vermek için -s parametresini kullanabilirsiniz:
# Dizin boyutunu hesaplayıp pv'ye bildirme
BOYUT=$(du -sb /var/www/html | awk '{print $1}')
tar -cf - /var/www/html | pv -s $BOYUT | gzip > /backup/web_backup_$(date +%Y%m%d).tar.gz
Bu şekilde gerçek bir ilerleme çubuğu ve ETA değeri görürsünüz. Büyük web sunucusu yedeklemelerinde kaç GB veri olduğunu ve ne kadar süreceğini önceden bilmek, bakım penceresi planlaması açısından çok önemlidir.
Arşivi Açarken İlerlemeyi İzleme
# Mevcut arşivin boyutunu alarak pv ile açma
pv /backup/web_backup_20241215.tar.gz | tar -xzf - -C /var/www/html
Bu komutta pv doğrudan dosyayı okuduğu için boyutu bilir ve tam ilerleme bilgisi gösterir. Disaster recovery senaryolarında yüzlerce GB’lık arşivi açarken bu bilgi çok rahatlatıcı olur.
Gerçek Dünya Senaryoları
Senaryo 1: Büyük Veritabanı Yedeği Alma
Bir PostgreSQL veritabanını dump alıp sıkıştırılmış olarak uzak bir konuma göndermem gerektiğinde şu pipeline’ı kullanırım:
pg_dump -Fc mydb | pv -s $(pg_dump -Fc mydb | wc -c) | gzip > /backup/mydb_$(date +%Y%m%d_%H%M).dump.gz
Ama bu yaklaşım veriyi iki kez üretir. Daha verimli bir yöntem:
# Önce boyutu tahmin et, sonra gerçek dump'ı al
pg_dump mydb | pv | gzip > /backup/mydb_$(date +%Y%m%d).sql.gz
Boyut bilgisi olmadan da hız ve süre takibi yapmak, uzun süren operasyonlarda yeterli bilgi sağlar. En azından işlemin devam edip etmediğini ve ne hızda gittiğini görürsünüz. Yavaşlama veya duraksama olduğunda anında fark edersiniz.
Senaryo 2: Sunucular Arası Büyük Dosya Transferi
SSH üzerinden büyük arşivleri taşımak sık karşılaşılan bir senaryo. pv burada da devreye girer:
# Yerel dosyayı uzak sunucuya pv ile gönderme
pv /backup/full_backup.tar.gz | ssh [email protected] "cat > /backup/full_backup.tar.gz"
Ya da doğrudan tar ile:
# Yerel dizini sıkıştırarak uzak sunucuya gönderme
tar -czf - /data/production | pv -s $(du -sb /data/production | awk '{print $1}') | ssh user@backup-server "cat > /backup/production_$(date +%Y%m%d).tar.gz"
Bu yöntem özellikle rsync‘in kullanılamadığı durumlarda veya tek seferlik büyük transferlerde çok işe yarar. Ağ hızını gerçek zamanlı görmeniz, bir darboğaz olup olmadığını tespit etmenizi sağlar.
Senaryo 3: Disk Klonlama Sırasında İlerleme Takibi
Sunucu migrasyonu sırasında disk imajı almak veya klonlamak gerektiğinde dd komutu tek başına hiçbir bilgi vermez. pv bu sorunu çözer:
# Disk imajı alırken ilerlemeyi izleme
pv /dev/sda | dd of=/backup/disk_image.img bs=4M
# Ya da doğrudan pv ile
pv -s $(blockdev --getsize64 /dev/sda) /dev/sda > /backup/disk_image.img
Sıkıştırarak imaj alma:
pv /dev/sda | gzip -c > /backup/disk_image.img.gz
500 GB’lık bir disk klonlamada ilerleme çubuğu görmek, operasyonun ne zaman biteceğini planlamanıza yardımcı olur.
Senaryo 4: Çoklu Arşiv Dosyasını Birleştirme
Birden fazla tar arşivini tek bir dosyada birleştirirken:
# Birden fazla arşivi birleştirip sıkıştırma
cat /backup/part1.tar /backup/part2.tar /backup/part3.tar | pv | gzip > /backup/combined.tar.gz
Toplam boyutu biliyorsanız:
TOPLAM=$(cat /backup/part1.tar /backup/part2.tar /backup/part3.tar | wc -c)
cat /backup/part1.tar /backup/part2.tar /backup/part3.tar | pv -s $TOPLAM | gzip > /backup/combined.tar.gz
Hız Sınırlama ile Sunucu Yükünü Kontrol Etme
Üretim ortamında çalışan sunucularda yedekleme işlemleri disk I/O’yu ve CPU’yu aşırı yükleyebilir. pv‘nin -L parametresi bu durumu kontrol altına almanızı sağlar:
# Maksimum 50MB/s ile arşivleme
tar -cf - /var/www | pv -L 50m | gzip > /backup/web.tar.gz
# Maksimum 10MB/s ile uzak transferde bant genişliği koruma
pv -L 10m /backup/large_file.tar.gz | ssh user@remote "cat > /backup/large_file.tar.gz"
Bu özellik özellikle iş saatlerinde çalışan sunucularda çok değerli. Yedekleme işlemini tamamen engellemek yerine hızını sınırlayarak sistemi normal operasyona açık tutabilirsiniz.
Bash Script ile Otomatik Yedekleme ve İlerleme Kaydı
Otomatik çalışan yedekleme scriptlerine pv entegre etmek, log dosyalarında daha anlamlı bilgi tutmanızı sağlar:
#!/bin/bash
# backup_with_progress.sh
KAYNAK="/var/www/html /etc /home"
HEDEF="/backup/$(date +%Y%m%d)"
LOG="/var/log/backup/backup_$(date +%Y%m%d).log"
mkdir -p "$HEDEF"
mkdir -p "$(dirname $LOG)"
echo "Yedekleme başladı: $(date)" | tee -a "$LOG"
for DIZIN in $KAYNAK; do
DIZIN_ADI=$(basename $DIZIN)
BOYUT=$(du -sb "$DIZIN" 2>/dev/null | awk '{print $1}')
echo "Arşivleniyor: $DIZIN ($(numfmt --to=iec $BOYUT))" | tee -a "$LOG"
tar -cf - "$DIZIN" 2>/dev/null |
pv -s "$BOYUT" -n 2>&1 |
gzip > "$HEDEF/${DIZIN_ADI}_$(date +%Y%m%d).tar.gz"
SONUC=$?
if [ $SONUC -eq 0 ]; then
echo "Tamamlandı: $DIZIN" | tee -a "$LOG"
else
echo "HATA: $DIZIN arşivlenemedi" | tee -a "$LOG"
fi
done
echo "Yedekleme tamamlandı: $(date)" | tee -a "$LOG"
Bu scriptte -n parametresi kullanılmıştır. Bu parametre yüzdeyi düz sayı olarak stderr’e yazar. Log dosyasında ilerleme yüzdesini görmek istiyorsanız bu yöntem idealdir.
zenity veya dialog ile Görsel İlerleme Çubuğu
Grafik arayüzü olan sistemlerde veya web tabanlı yönetim panellerinde pv -n çıktısını zenity ya da dialog‘a bağlayabilirsiniz:
# zenity ile görsel ilerleme çubuğu (masaüstü ortamı için)
BOYUT=$(du -sb /home/user/Documents | awk '{print $1}')
tar -cf - /home/user/Documents |
pv -n -s $BOYUT 2>&1 >/dev/null |
zenity --progress --title="Yedekleme" --text="Dosyalar arşivleniyor..." --auto-close
# dialog ile terminal tabanlı görsel ilerleme
BOYUT=$(du -sb /var/log | awk '{print $1}')
tar -cf - /var/log |
pv -n -s $BOYUT 2>&1 |
dialog --gauge "Log dosyaları yedekleniyor..." 10 70 0
Bu yöntemler özellikle teknik olmayan kullanıcılara yönelik yönetim araçları geliştirirken veya shell script’lerinizi daha kullanıcı dostu hale getirmek istediğinizde işe yarar.
xz ve bzip2 ile Kullanım
gzip‘ten daha yüksek sıkıştırma oranı isteyen durumlarda xz veya bzip2 tercih edilir. Bu araçlar daha yavaş çalışır, bu yüzden ilerleme takibi daha da önemli hale gelir:
# xz ile sıkıştırma (en yüksek oran, en yavaş)
BOYUT=$(du -sb /data/archive | awk '{print $1}')
tar -cf - /data/archive | pv -s $BOYUT | xz -9 > /backup/archive.tar.xz
# bzip2 ile orta seviye sıkıştırma
tar -cf - /data/archive | pv -s $BOYUT | bzip2 > /backup/archive.tar.bz2
xz -9 ile büyük veri setlerini sıkıştırırken saatlerce sürebilecek operasyonlarda pv olmadan terminal başında beklemek gerçekten sıkıcı ve gereksiz bir belirsizlik yaratır. ETA değeri size kahvenizi ne zaman alabileceğinizi söyler.
pv ile Şifreli Yedekleme
GPG ile şifreli arşiv oluştururken de pv pipeline’a dahil edilebilir:
# Şifreli ve sıkıştırılmış yedekleme
BOYUT=$(du -sb /data/sensitive | awk '{print $1}')
tar -cf - /data/sensitive |
pv -s $BOYUT |
gzip |
gpg --symmetric --cipher-algo AES256 > /backup/sensitive_$(date +%Y%m%d).tar.gz.gpg
# Şifreli yedekten geri yükleme
pv /backup/sensitive_20241215.tar.gz.gpg |
gpg --decrypt |
gunzip |
tar -xf - -C /data/
Şifreleme işlemi CPU yoğun olduğundan hız sütunu burada gerçek bir darboğaz göstergesi haline gelir. Normalden çok düşük bir hız görüyorsanız CPU limitine yaklaşıyor olabilirsiniz.
Yaygın Hatalar ve Çözümleri
pv kullanırken karşılaşılan bazı yaygın durumlar:
- Yüzde gösterilmiyor:
pvboyutu bilmiyordur.-s $(du -sb /dizin | awk '{print $1}')ekleyin. - pv bulunamıyor hatası: Paket yüklü değildir. Dağıtımınıza uygun paket yöneticisiyle kurun.
- İlerleme çubuğu script’te görünmüyor:
pvçıktısını stderr’e yazar. Cron job veya script’te görmek için-fparametresi ile stderr’i bir log dosyasına yönlendirin. - Hız çok düşük görünüyor: Sıkıştırma algoritması CPU darboğazı yaratıyor olabilir.
gzipyerinelz4gibi daha hızlı bir alternatif düşünün. - ETA tutarsız: Sıkıştırılabilirliği farklı veri tiplerini arşivliyorsanız hız değişkenlik gösterir ve ETA yanıltıcı olabilir. Bu normaldir.
lz4 ile Hızlı Sıkıştırma Kombinasyonu
Büyük veri setlerinde hız öncelikliyse lz4 ile pv kombinasyonu mükemmel çalışır:
# lz4 kurulumu
sudo apt install lz4
# Çok hızlı sıkıştırma ile yedekleme
BOYUT=$(du -sb /var/lib/mysql | awk '{print $1}')
tar -cf - /var/lib/mysql | pv -s $BOYUT | lz4 > /backup/mysql_$(date +%Y%m%d).tar.lz4
# Geri yükleme
pv /backup/mysql_20241215.tar.lz4 | lz4 -d | tar -xf - -C /var/lib/
lz4, gzip‘ten çok daha hızlı çalışır (genellikle 3-5 kat) ve sıkıştırma oranı makul seviyededir. Hız kritikse ve disk alanı sorun değilse ideal seçimdir.
Sonuç
pv, Linux sistem yöneticisinin araç kutusunda küçük ama vazgeçilmez bir yere sahip. Özellikle arşivleme ve sıkıştırma işlemlerinde sağladığı görünürlük, operasyonel güveni artırır ve sorunları erken tespit etmenizi sağlar. İşlem ne kadar ilerledi, ne zaman bitecek, I/O hızı normal mi gibi sorulara anlık cevap vermesi, uzun süren bakım operasyonlarında büyük bir avantaj sağlar.
Günlük kullanımda en çok değer kattığı senaryolar şunlardır: sunucular arası büyük veri transferleri, veritabanı dump ve restore işlemleri, disk klonlama ve imaj alma, büyük log arşivleri oluşturma. Bu durumların herhangi birinde pv‘yi pipeline’a eklemek, sizi kör bir bekleme durumundan kurtarır.
Bir sonraki yedekleme işleminizde terminale bakıp “bitiyor mu acaba” diye merak etmeden önce pv‘yi pipeline’a ekleyin. Birkaç dakika içinde vazgeçemeyeceğiniz bir araç haline gelecektir.