PV и Progress — как видеть прогресс копирования и других операций в Linux

Введение
Представьте, что вы начали копирование очень большого файла с флешки в систему Linux через командную строку. Операция занимает длительное время, вы отвлеклись и через некоторое время возвращаетесь, чтобы увидеть, что команда всё ещё выполняется без явных изменений и без ошибок. Часто варианты действий ограничены: ждать или прервать и запустить заново.
Было бы удобно видеть прогресс, как в графическом интерфейсе. В этой заметке мы подробно разберём две утилиты, которые дают прогресс прямо в терминале: pv и Progress. Обе проверены на практике и подходят для разных сценариев использования.
Важно
Все примеры и команды тестировались в окружении Ubuntu 14.04. Для других дистрибутивов названия пакетов и менеджеры пакетов могут отличаться.
Кому и когда это полезно
- Сисадминам, которые работают на headless-серверах
- Разработчикам, копирующим большие архивы или образы
- Тем, кто хочет ограничить скорость передачи, чтобы не перегружать диск или сеть
- Любому, кто предпочитает визуальную обратную связь при длительных операциях
Краткая характеристика инструментов
- pv — вставляется в пайп между процессами, пропускает stdin в stdout и показывает панель прогресса, скорость, переданные данные, оставшееся время
- Progress — сканирует запущенные процессы и показывает прогресс по командам coreutils, не требуя модификации исходной команды
Утилита pv: установка и примеры использования
pv мониторит поток данных через конвейер. Вы вставляете pv между двумя процессами, и он выводит информацию о прогрессе на stderr: прошедшее время, процент и прогресс-бар, текущая скорость передачи, объём переданных данных и ETA.
Установка на Debian/Ubuntu:
sudo apt-get install pv
Простой пример: копирование каталога изображений с флешки в gzip-архив на рабочий стол
pv /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
В этом примере pv выводит прогресс-бар и другие метрики по умолчанию. Если нужно оставить только прогресс-бар, используйте ключ -p:
pv -p /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
Некоторые полезные опции pv:
- -p показывать только прогресс-бар
- -t показывать прошедшее время
- -e показывать ETA
- -r показывать скорость передачи
- -W ждать передачи первого байта перед расчётом статистики
- -L ограничить скорость передачи, например 5m для 5 мегабайт в секунду
Пример ограничения скорости до 5 МБ/с:
pv -L 5m /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
Примечание о суффиксах: k, m, g, t соответствуют килобайтам, мегабайтам и т. п. согласно поведению man page pv.
Когда pv не подходит
- Если у вас уже запущена команда без pv и вы не хотите перезапускать процесс, pv бесполезен
- Для мониторинга произвольных процессов pv нужно явно вставить в поток данных
Утилита Progress: мониторинг уже запущенных процессов
Progress (раньше называлась cv) сканирует процессы и показывает прогресс для команд coreutils и некоторых других: cp, mv, dd, tar, gzip/gunzip, cat и т. д. Утилита может показывать оценочное время и пропускную способность, есть режим мониторинга наподобие top.
Перед установкой убедитесь, что установлена библиотека ncurses, так как Progress зависит от неё. На Debian/Ubuntu:
sudo apt-get install libncurses5-dev
Клонируем репозиторий и устанавливаем:
git clone https://github.com/Xfennec/progress.git
cd progress
make
sudo make install
После установки вы можете запустить progress и увидеть список отслеживаемых операций.
Основные опции progress:
- -m, –monitor повторять вывод, пока наблюдаемые процессы выполняются
- -M, –monitor-continuously постоянно показывать мониторинг, даже если процессы заканчиваются
- -c, –command cmd фильтровать по имени команды, можно указывать несколько раз
- -p, –pid id фильтровать по pid, можно указывать несколько раз
- -i, –ignore-file file не показывать процесс по файлу, требуется абсолютный путь
Когда Progress не подходит
- Ограничен набором поддерживаемых команд, в отличие от pv
- Для некоторых специфичных инструментов или когда процесс не использует стандартные системные вызовы чтения/записи, распознавание может не работать
Сравнение pv и Progress — когда что использовать
Ментальная модель
- Если вы планируете конвейер и можете вставить инструмент в поток, используйте pv: прямой контроль, гибкие опции, ограничение скорости
- Если процесс уже запущен или вы не хотите его менять, используйте Progress: наблюдение за системой извне
Таблица выбора по сценарию
- Копирование файлов через cat или gzip в пайпе → pv
- mv или cp, запущенные вручную без pv → Progress
- Нужно ограничить скорость передачи → pv с -L
- Нужно мониторить сразу все похожие операции → Progress с –monitor
Альтернативные подходы и команды-замены
- dd status=progress — показывает прогресс в некоторых современных версиях dd, удобно для образов и блочных операций
dd if=/dev/zero of=bigfile bs=1M count=1024 status=progress
- rsync -P — показывает прогресс и позволяет продолжать прерванные копирования
rsync -avP /source/ /dest/
- cp –verbose или cp –progress — в некоторых реализациях есть прогресс, но это зависит от версии coreutils
Практические подсказки и сценарии
- Если ожидается, что команда будет долго висеть до первого байта, используйте pv –wait или -W, чтобы статистика не давала ложное ETA
- Для сетевого копирования учитывайте, что ограничение pv -L действует на локальную скорость пайпа, а не на сетевые буферы транспортного слоя
- При использовании Progress на многопользовательской системе учитывайте права: прогресс можно увидеть только для процессов, которые ваш пользователь может прочитать
Чеклист по ролям
Системный администратор
- Установить pv и progress через менеджер пакетов или из исходников
- Проверить доступность ncurses для progress
- Настроить скрипты резервного копирования с pv для контроля скорости и логирования
Разработчик
- Использовать pv в пайпах для измерения скорости и ETA
- При тестировании большого вывода добавлять -W, чтобы избежать неверных оценок ETA
Обычный пользователь
- Если не хочется устанавливать из исходников, искать пакеты в репозиториях дистрибутива
- Для единичных операций использовать rsync -P или dd status=progress
Полезные примеры и шпаргалка
Скорость и прогресс в пайпе:
pv -pter -L 5m file.iso | gzip > file.iso.gz
Мониторинг уже запущенных операций:
progress --monitor
Мониторинг только процессов cp и mv:
progress -c cp -c mv --monitor
Ограничение скорости вывода в байтах:
pv -L 500k bigfile > /dev/null
Использование dd с прогрессом:
dd if=big.img of=/dev/sdb bs=4M status=progress
Rsync с показом прогресса и продолжением:
rsync -avP /mnt/usb/ /backup/usb_backup/
Критерии приёмки
- Видна полоса прогресса или численные метрики для долгих операций
- При использовании pv не нарушается корректность переданных данных
- При использовании progress отображается актуальная информация о процессах, для которых есть права доступа
Контроль рисков и ограничения
- Ни pv, ни Progress не гарантируют точность ETA на 100 процентов для операций с непредсказуемой скоростью ввода/вывода
- Progress зависит от поддержки команд в репозитории распознавания процессов; в особых случаях распознавание может быть некорректным
- При ограничении скорости через pv учтите влияние на общую производительность системы
Краткий глоссарий
- пайп — механизм передачи stdout одной команды в stdin другой
- ETA — ожидаемое оставшееся время выполнения
- throughput — пропускная способность, скорость передачи данных
Заключение
pv и Progress решают одну и ту же задачу визуальной обратной связи, но по-разному. pv вставляется в поток и даёт детальную статистику и контроль скорости. Progress наблюдает за уже запущенными процессами и удобен, когда изменение команды невозможно или нежелательно. Выбор между ними зависит от сценария: планируете ли вы пайп заранее или хотите мониторить существующие процессы.
Короткие рекомендации
- Если вы можете изменить команду и вам нужен контроль — используйте pv
- Если вы хотите мониторить множество запущенных операций без перезапуска — используйте Progress
Сводка
- pv подходит для пайпов, ограничения скорости и точных метрик
- Progress удобен для наблюдения за командами coreutils без модификации команд
- Альтернативы: dd status=progress, rsync -P
Спасибо за внимание. Надеюсь, это поможет вам получать ясную обратную связь при длинных операциях в терминале.
Похожие материалы

Как улучшить качество видео в Windows

Восстановление слегка размытых фотографий

Исправить потерю пакетов в Fall Guys

Использование Word 2010 как офлайнового редактора блога

PV и Progress: прогресс копирования в Linux
