Przejdź do głównej zawartości

pv


  • pv (Pipe Viewer) – narzędzie do podglądu postępu przesyłania danych w potokach: pokazuje czas, pasek postępu, procent, ETA, prędkość i liczbę bajtów.
  • Zastosowania: kopiowanie dużych plików/dysków, kompresja/dekompresja w potokach, transfer przez nc/ssh, throttling (--rate-limit), skrypty z paskiem (-n).
  • Dostępność: pakiety większości dystrybucji Linux (Debian/Ubuntu, Fedora/RHEL/Alma, Arch), także BSD i macOS.

Okno terminala
pv [opcje] [PLIK...]
# typowo w potokach:
źródło | pv [opcje] | cel
  • Bez PLIK odczytuje stdin, wypisuje na stdout (jak cat).
  • Domyślnie (gdy stderr to TTY) włącza: --progress --timer --eta --rate --bytes.
  • Pasek i procent są dokładne, gdy znany jest rozmiar (--size). Gdy rozmiar nieznany, pasek „faluje” lub można użyć --gauge.

ParametrOpis
-p, --progressPokaż pasek postępu / procent.
-t, --timerPokaż czas trwania.
-e, --etaPokaż ETA (czas do końca).
-r, --ratePokaż bieżącą prędkość transferu.
-a, --average-ratePokaż średnią prędkość (okno domyślnie 30 s; patrz -m).
-b, --bytesPokaż licznik bajtów (lub linii z -l).
-g, --gaugeGdy rozmiar nieznany – pasek pokazuje procent maks. prędkości.
-l, --line-modeLicz linie (zakańczane \n); z -0 linie zakończone NUL.
-0, --nullLicz linie zakończone NUL (implikuje -l).
-s, --size <ROZ>Załóż całkowity rozmiar; akceptuje sufiksy K/M/G/T (1024‑krotne). --si zmienia na 1000‑krotne. --size @plik – weź rozmiar z pliku.
-i, --interval <sek>Interwał odświeżania (np. 0.1).
-m, --average-rate-window <sek>Okno czasowe do średniej/ETA (domyślnie 30).
-L, --rate-limit <B/s>Ogranicz prędkość (np. 500k, 2M, 1.5G).
-B, --buffer-size <B>Rozmiar bufora transferu.
-N, --name <etykieta>Etykieta przed paskiem (przy wielu pv w potoku).
-w, --width <kol> / -H, --height <wierszy>Załóż szerokość/wysokość terminala.
-f, --forceWymuś wyświetlanie nawet gdy stderr nie jest TTY (np. Docker/CI).
-n, --numericZamiast paska – liczba (procent/bajty/linie) linia po linii na stderr (do dialog/zenity).
-o, --output <plik>Pisz dane do pliku zamiast na stdout.
-D, --delay-start <sek>Zacznij wyświetlać dopiero po zadanym czasie.
-c, --cursorUżyj sterowania kursorem (przy wielu paskach z --name).
-u, --bar-style <plain/block/granular/shaded>Styl paska postępu.
-Y, --syncfdatasync(2) po każdym zapisie (dokładniejsze tempo na wolnych dyskach).
-K, --direct-ioO_DIRECT dla IO (omija cache; ryzyko „Invalid argument”).
-E, --skip-errorsPomijaj błędy odczytu (wstawiaj NULe; jak dd conv=noerror,sync).
-Z, --error-skip-block <B>Rozmiar bloku pomijania przy --skip-errors (np. 4K).
-S, --stop-at-sizeZatrzymaj po osiągnięciu --size.
-X, --discardPorzuć dane zamiast je wypisywać (szybkie „/dev/null”).
-U, --store-and-forward <plik>Dwuetapowo: najpierw zapisz całość do pliku, potem odczytaj – pomaga, gdy rozmiar znany dopiero po wygenerowaniu danych.
-d, --watchfd <PID[:FD]>Nie przenosi danych – obserwuj deskryptor procesu.
-R, --remote <PID>Zdalnie steruj działającym pv (zmień np. limit prędkości).
-P, --pidfile <plik>Zapisz PID pv do pliku.
-h, --help / -V, --versionPomoc / wersja.

Okno terminala
# 1) Kopiowanie obrazu ISO na pendrive z paskiem postępu
pv -pterb linux.iso | sudo dd of=/dev/sdX bs=4M conv=fsync status=none
# Efekt: dokładny procent, ETA i prędkość; dd zapisuje na urządzenie (UWAGA na /dev/sdX!).
Okno terminala
# 2) Tworzenie tar.gz z dokładnym procentem (rozmiar z du -sb)
tar cf - katalog/ \
| pv --size "$(du -sb katalog | awk '{print $1}')" \
| gzip -9 > backup.tar.gz
# Efekt: pasek oparty o faktyczny rozmiar katalogu.
Okno terminala
# 3) Throttling transferu (1 MiB/s) i ciche dane do /dev/null
pv -L 1M duzy_plik.bin > /dev/null
# Efekt: ograniczenie prędkości; przydatne przy testach łącz/IO.
Okno terminala
# 4) GUI/TTY: emituj procenty liczbowo (np. dla dialog/zenity)
pv -n duzy_plik.bin | dd of=/dev/null 2>&1 | dialog --gauge 'Postęp' 10 50
# Efekt: `pv` wypisuje liczby na stderr; przekierowane do programu paska.
Okno terminala
# 5) Etykiety i kilka pasków w jednej linii (cursor + name)
( tar cf - src | pv -cN TAR --size "$(du -sb src | awk '{print $1}')" \
| gzip -9 | pv -cN GZIP | ssh host 'cat > out.tar.gz' )
# Efekt: dwa czytelnie podpisane paski dla etapów TAR i GZIP.
Okno terminala
# 6) Obrazowanie dysku z pomijaniem błędów odczytu (ryzykowne!)
sudo pv -E --error-skip-block 4K /dev/sdb | dd of=image.bin bs=4K conv=noerror,sync
# Efekt: części z błędami zostaną pominięte/zastąpione NUL; obraz może mieć luki.
Okno terminala
# 7) Podgląd deskryptora procesu (np. PID: plik kopiowany przez inny program)
pv --watchfd 1234:3
# Efekt: pokazuje postęp, gdy proces 1234 zapisuje na FD=3; kończy, gdy FD zamknięty.

  • Wyjście na stderr: Pasek idzie na stderr, dane – na stdout. To zwykle nie psuje potoku; do wymuszenia w środowiskach bez TTY (np. Docker/CI) użyj -f.
  • Dokładność procentu: Podaj rozmiar --size (także --size @plik). Gdy rozmiar nieznany, rozważ --gauge lub zaakceptuj „falowanie” paska.
  • Wydajność: Bufor (-B) i --no-splice wpływają na zachowanie; na macOS czasem pomaga --buffer-size 1024.
  • Bezpieczeństwo urządzeń: Operacje na /dev/sdX wymagają roota i ostrożności – zły of= może zniszczyć dane.
  • Tryb linii (-l): Jeśli nie podasz --size, pv może zrobić przebieg wstępny, by policzyć linie (dla zwykłych plików). Strumienie/pipe uniemożliwiają ten krok.
  • Zdalne sterowanie (-R): Nie wszystkie opcje da się zmienić w locie (np. --cursor, --line-mode, --skip-errors).

Błąd / KomunikatPrzyczynaRozwiązanie
pv: command not foundBrak pakietuZainstaluj: apt install pv / dnf install pv / pacman -S pv.
„Nic nie wyświetla” w Docker/CIstderr nie jest TTYDodaj -f, lub użyj -n i przekaż liczby do narzędzia paska (np. dialog).
Pasek „stoi” / brak procentuNieznany rozmiar danychPodaj --size lub użyj --gauge; dla katalogów: du -sb.
Invalid argument przy --direct-ioWymogi wyrównania/FSUsuń -K lub dopasuj rozmiary bloków (bs= w dd).
Permission denied z /dev/sdXBrak uprawnień do urządzeniaUżyj sudo/root; upewnij się, że wskazujesz właściwe urządzenie.
Zaniżona prędkość/„szarpanie”Za krótki interwał/mały buforZwiększ -i (np. 0.5) lub -B; sprawdź obciążenie I/O/CPU.