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.
Składnia
Dział zatytułowany „Składnia”pv [opcje] [PLIK...]# typowo w potokach:źródło | pv [opcje] | cel
- Bez
PLIK
odczytuje stdin, wypisuje na stdout (jakcat
). - 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
.
Parametry
Dział zatytułowany „Parametry”Parametr | Opis |
---|---|
-p, --progress | Pokaż pasek postępu / procent. |
-t, --timer | Pokaż czas trwania. |
-e, --eta | Pokaż ETA (czas do końca). |
-r, --rate | Pokaż bieżącą prędkość transferu. |
-a, --average-rate | Pokaż średnią prędkość (okno domyślnie 30 s; patrz -m ). |
-b, --bytes | Pokaż licznik bajtów (lub linii z -l ). |
-g, --gauge | Gdy rozmiar nieznany – pasek pokazuje procent maks. prędkości. |
-l, --line-mode | Licz linie (zakańczane \n ); z -0 linie zakończone NUL. |
-0, --null | Licz 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, --force | Wymuś wyświetlanie nawet gdy stderr nie jest TTY (np. Docker/CI). |
-n, --numeric | Zamiast 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, --cursor | Użyj sterowania kursorem (przy wielu paskach z --name ). |
-u, --bar-style <plain/block/granular/shaded> | Styl paska postępu. |
-Y, --sync | fdatasync(2) po każdym zapisie (dokładniejsze tempo na wolnych dyskach). |
-K, --direct-io | O_DIRECT dla IO (omija cache; ryzyko „Invalid argument”). |
-E, --skip-errors | Pomijaj 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-size | Zatrzymaj po osiągnięciu --size . |
-X, --discard | Porzuć 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, --version | Pomoc / wersja. |
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 1) Kopiowanie obrazu ISO na pendrive z paskiem postępupv -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!).
# 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.
# 3) Throttling transferu (1 MiB/s) i ciche dane do /dev/nullpv -L 1M duzy_plik.bin > /dev/null# Efekt: ograniczenie prędkości; przydatne przy testach łącz/IO.
# 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.
# 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.
# 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.
# 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łyof=
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
).
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Komunikat | Przyczyna | Rozwiązanie |
---|---|---|
pv: command not found | Brak pakietu | Zainstaluj: apt install pv / dnf install pv / pacman -S pv . |
„Nic nie wyświetla” w Docker/CI | stderr nie jest TTY | Dodaj -f , lub użyj -n i przekaż liczby do narzędzia paska (np. dialog ). |
Pasek „stoi” / brak procentu | Nieznany rozmiar danych | Podaj --size lub użyj --gauge ; dla katalogów: du -sb . |
Invalid argument przy --direct-io | Wymogi wyrównania/FS | Usuń -K lub dopasuj rozmiary bloków (bs= w dd ). |
Permission denied z /dev/sdX | Brak uprawnień do urządzenia | Użyj sudo /root; upewnij się, że wskazujesz właściwe urządzenie. |
Zaniżona prędkość/„szarpanie” | Za krótki interwał/mały bufor | Zwiększ -i (np. 0.5 ) lub -B ; sprawdź obciążenie I/O/CPU. |
Linki i źródła
Dział zatytułowany „Linki i źródła”- man pv – oficjalna strona podręcznika.
- pv – strona projektu – informacje i zgłaszanie błędów.
- Pakiet pv (Debian) – opis i instalacja.