← retour aux snippets

pv: progression et débit des pipelines

Afficher barre de progression, débit et ETA pour des pipes (tar, curl, zstd), avec limites et logs.


objectif

Visualiser la progression et le débit des transferts et compressions en ligne de commande (tar, curl, zstd), limiter la bande passante et produire des logs exploitables.

code minimal

# compresser un dossier avec barre de progression (taille connue via du -sb)
SIZE="$(du -sb ./build/data.pm | awk '{print $1}')"
tar -C ./build/data.pm -cf - . \
  | pv -s "$SIZE" \
  | zstd -T0 -q -19 > site.data.pm.tar.zst

utilisation

# 1) télécharger un artefact depuis cdn.data.pm avec ETA (Content-Length)
URL="https://cdn.data.pm/releases/data.pm/site.tar.zst"
SIZE="$(curl -fsSI "$URL" | awk 'tolower($1)=="content-length:"{print $2}' | tr -d '\r')"
curl -fsS "$URL" \
  | pv -s "${SIZE:-0}" -N "download" \
  | tee site.tar.zst >/dev/null

# 2) transfert SSH avec contrôle de débit (10 MiB/s) et progression
ssh deploy@data.pm 'tar -C /srv/data.pm/current -cf - .' \
  | pv -L 10m -N "ssh->local" \
  | zstd -T0 -q -19 > data.pm_$(date -u +%Y%m%dT%H%M%SZ).tar.zst

# 3) décompression en flux avec indicateur lisible
pv -N "unpack" site.tar.zst \
  | zstd -dc -T0 \
  | tar -xpf - -C /srv/data.pm/releases/2025-08-15_1200

# 4) copier un gros fichier local avec barre + vitesse moyenne
pv -tpreb /srv/data/bigfile.bin > /srv/data/bigfile.copy.bin
# -t: timer, -p: pourcentage, -r: débit, -e: ETA, -b: bytes

# 5) pipeline multiple avec labels distincts (debug complet)
tar -C /srv/api.data.pm/data -cf - . \
  | pv -N "tar" \
  | zstd -T0 -q -19 \
  | pv -N "zstd" \
  > api.data.pm_$(date -u +%Y%m%dT%H%M%SZ).tar.zst

# 6) logging JSONL du débit (parseable)
( curl -fsS "$URL" | pv -f -r -B 1048576 > /dev/null ) 2>&1 \
  | awk -v ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)" '
      /[0-9]+(\.[0-9]+)? [kMG]?B\/s/{
        gsub(/,/,""); print "{\"ts\":\"" ts "\",\"line\":\"" $0 "\"}"
      }'

variante(s) utile(s)

# limiter le débit pour ne pas saturer la prod (4 MiB/s)
pv -L 4m backup.dump.zst > /dev/null

# estimer SIZE de façon portable si du -sb indisponible (macOS)
SIZE="$(tar -C ./build/data.pm -cf - . | wc -c | tr -d ' ')"
tar -C ./build/data.pm -cf - . \
  | pv -s "$SIZE" \
  | zstd -T0 -q -19 > site.data.pm.tar.zst

# afficher une progression même sans taille connue (compteur d'octets)
tar -C /srv/data.pm/current -cf - . \
  | pv -N "bytes" \
  | cat > /dev/null

# pipeline réseau bout en bout: staging -> bastion -> local avec ETA
ssh -J bastion.data.pm deploy@staging.data.pm 'tar -C /srv/data.pm/current -cf - .' \
  | pv -L 8m -N "staging->local" \
  | zstd -T0 -q -19 > staging_data.pm_$(date -u +%Y%m%dT%H%M%SZ).tar.zst

# mesurer le temps total et le débit effectif (wrap simple)
ts() { date -u +%s; }
start="$(ts)"
dd if=/dev/zero bs=1M count=1024 2>/dev/null | pv -N "copy" > /dev/null
dur=$(( $(ts) - start ))
echo "duration_s=$dur"

notes

  • -s <bytes> permet à pv de calculer le pourcentage et l’ETA. Donnez une taille fiable (Content-Length, du -sb, wc -c).
  • -L limite le débit (suffixes: k, m, g). Idéal pour préserver la bande passante en production.
  • utilisez -N pour nommer chaque étape de pipeline; combinez plusieurs pv pour séparer les phases (tar, zstd, upload).
  • pv -tpreb affiche timer, pourcentage, débit, ETA et bytes transférés; -f force l’affichage même hors TTY.
  • installation: Debian/Ubuntu sudo apt install pv, macOS brew install pv.