pv — маленькая, но очень полезная утилита

    Один мой друг сказал по поводу pv следующее «Я админю семь лет, мне нужна была эта тулза десятки раз, а я даже не знал что она существует». В размышлениях над тем как заполучить инвайт на Харбе, я набрал в поиске pv. И ничего не нашел.


    И так pv — это сокращенно от pipeviewer, то есть ни много не мало как просмотрщик пайпов. Про эффективность использования пайпов расказывать не буду, ни для кого это не секрет. Единственное, «но» в работе с ними — это то, что набрав команду и нажав Enter часто не хватает самой малости — знать сколько времени займет ее выполнение. Именно cкорость обработки данных и будет нам показывать pv.

    С лирикой покончено, перейдем к примерам.

    Установка pv в Debian довольно тривиальна.
    % sudo aptitude install pv

    Дальше вводная, допустим вы такой же как и я счасливый обладатель каких-нибудь полезных логов и в какой-то момент у вас дошли руки их заархивировать, например так
    % cat rt94-171-06 | gzip > rt94-171-06.gz
    Есть мысли, сколько времени займет эта операция?

    Тоже самое при помощи pv
    %pv rt94-171-06 | gzip > rt94-171-06.gz
    128MB 0:00:15 [ 9.1MB/s] [=====>.....................] 18% ETA 0:01:07

    Наглядно видно, что через пайп за 15 секунд прошло 128Мб — это 18% от всего объема, операция займет еще минуту и 7 секунд.

    Может показаться, что pv это такая замена для cat, но на самом деле ее возможности намного шире. Например, упаковываем весь каталог в сжатый архив
    %tar -czf - . | pv > out.tgz
    21.9MB 0:00:15 [1.47MB/s] [...<=>.....................]

    Уже неплохо, но хочеться большего, чтобы показывалось время окончания работы. Для этого всего лишь надо при помощи ключа -s передать pv размер каталога в байтах
    %tar -czf - . | pv -s $(du -sb | grep -o '[0-9]*') > out.tgz
    44.3MB 0:00:27 [1.73MB/s] [>..........................] 0% ETA 13:36:22

    У меня вся операция займет 13 с половиной часов. Хех, накопил =)

    Можно так же составлять команды из несколько копий pv.
    %tar -cf - . | pv -cN tar -s $(du -sb | grep -o '[0-9]*') | gzip | pv -cN gzip > out.tgz
    tar: 97.1MB 0:00:08 [12.3MB/s] [>......................] 0% ETA 1:50:26
    gzip: 13.1MB 0:00:08 [1.6MB/s] [....<=>................]

    Ключ -c нужен, чтобы несколько копий pv не выводили информацию друг поверх друга. Ключ -N дает имя шкале.

    Ну и под конец забавный пример с одного англоязычного блога о Линуксе
    %pv /dev/urandom > /dev/null
    18MB 0:00:05 [ 3,6MB/s] [...<=>............................]
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 91
    • +27
      Столько еще неизвестного и полезного ожидает тебя, друг!
      • +1
        Весьма удобно. Будем пользоваться.
        • +1
          Спасибо вам.
          /*пошел переписывать скрипты
          • НЛО прилетело и опубликовало эту надпись здесь
            • +2
              Отличное начало =) Поздравляю!
              • +2
                Классная вещь. Хочу такое же в PowerShell, и Write-Progress даже не предлагайте. Пошел помотреть, как бы такую штуку сделать.
                Вот как Linux помогает развиваться Windows… :)
                • +8
                  Я бы хотел узнать у уважаемого сообщества — а за что минусы? Не хочу никого обидеть, но что за снобизм (простите — хотя и знаю, что не простите, а заминусуете еще больше)? Что, Linux становится некошерным, если в посте про POSIX программу упоминается (в положительном смысле) Windows? или это плохо, если в PowerShell будет утилита похожая на pv?

                  В любом случае — даже если ответ на все вопросы «да», хотелось бы услышать об этом, вместо молчаливых минусов. Ну так, чтобы знать в будущем, о чем не стоит говорить (даже если думаешь).

                  Спасибо.
                  • –4
                    я тоже хочу такую-же штуку в PowerShell. а минусуют вас вероятно те, кто только-что узнал об этой утилите, установил, и желает чтобы вы им завидовали :)
                    • –1
                      В том-то все и дело! Поставил минус, значит не согласен — ну так объясни. Понятно, что минуснуть легко, а объяснить труднее. Но, если уж принял на себя груз (или это удовольствие?) минуснуть — так объясни, почему (говоря более формальным языком, я бы сказал что в голосовании «плюсануть» и «минусонуть» несимметричны — в случае согласия не нужно выражать свое мнение, так как оно выражено заранее. При несогласии, как минимум, слегка отличное мнение присутствует, и поделиться им не помешало бы).

                      В конце-концов, мы все тут уж точно не с целью испортить друг другу настоение.

                      Или я ошибаюсь?

                      В конце концов, плюньте вы на мой комментарий! Просто задумайтесь — минусуете молчаливо (возможно, портите желание вообще в будущем участвовать в жизни Хабра). Ну так возьмите за труд объяснить! Это просто — нужно только нажать 10-20 клавиш :)
                    • –1
                      >> чтобы знать в будущем, о чем не стоит говорить (даже если думаешь)

                      О том что думаешь, говорить нужно, невзирая на обстоятельства. И это я не только про хабр.
                      • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    Спасибо, хорошая утилита!
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • 0
                        ваш пример гениален:)
                        • +13
                          pv /dev/zero > /dev/null
                          10GB 0:00:03 [3,11GB/s] [                  <=>                     ]
                          • +3
                            pv /dev/zero > /dev/null
                            15GB 0:00:15 [7,69GB/s] [                                <=>                             ]

                            :)
                            • 0
                              pv /dev/zero > /dev/null
                              3GB 0:00:06 [8,74GB/s] [ <=> ]

                              Альфа 3 убунты 9.10. Скорость работы дисковой подсистемы возросла?
                              • +1
                                При чем здесь работа дисковой подсистемы?! /dev/zero и /dev/null никак не связаны с дисковой системой (ну только тем, что их можно использовать как настоящие файлы :)).

                                В этом тесте скорость зависит от процессора, частоты шины и частоты работы памяти. Этот показатель показывает с какой скоростью ядро может генерировать нули и уничтожать их в памяти.

                                У меня был тест на Linux Mint 7.0 (основан на Ubuntu 9.04).

                                На моем десктопе — Core 2 Duo E8200 (2.66ГГц), разогнанный до 3.4ГГц + DDR2 2048 Mb PC-8500 (1066MHz) Corsair (2x1024). Результат: 7.7GB/s
                                На моем домашнем сервере Celeron Dual-Core (1.66ГГц) + DDR2 2048 Mb PC-6400 (800Mhz) Samsung. Результат: 5,03GB/s
                                • +1
                                  AX2 4000+, 2x1024Мб Hynix DDR2-800 — 7.03GB/s
                                  так что все относительно
                                  Разогнанный C2D E8200 явно мощнее стокового AX2 4000+, да и память… Однако разница всего в 700Мб/сек
                                  • 0
                                    Извините, я ошибся. Я думал, что у меня разогнанный процессор и память на всю работает… Я совсем забыл, что с такой жарищей наоборот понизил все. На 7.7Гб/сек у меня стоял процессор на 2.33ГГц и память работала на 800Мгц.

                                    Для нового теста я поднял частоту процессора до 3.55ГГц и память — 1066МГц. В результате получилось 10.2Гб/сек.

                                    Еще раз, извиняюсь. Но C2D явно мощнее AX2… Эх, было время я тоже AMD любил…
                                  • 0
                                    Да, точно не причем.

                                    А насчет ускорения в 9.10 все таки похоже что так и есть.
                                    У меня 8.7GB/s выдает на Core2Duo 4600 разогнаного до 3ГГц + DD2 2048 1066 Mhz.
                                    • 0
                                      [web@server1 ~]$ pv /dev/zero > /dev/null
                                      82.1GB 0:00:09 [9.15GB/s] [ <=> ]

                                      :)
                                      • +1
                                        передаю привет из будущего, с офисного компа.

                                        $ pv /dev/zero > /dev/null
                                        878GiB 0:00:53 [16,6GiB/s] [ <=> ]
                                        • 0
                                          Ага, спустя 6 лет: Core I5 2500K 17,8 GiB/s. До Мура не дотягивает, всего в два раза возросло! Хотя скорее всего дело в памяти — она вроде не так сильно ускорялась, как процессоры. +Судя по htop'у загружается только одно ядро.
                                          А из urandom'а 21 MiB/s — тут разница с 2009 годом заметнее.
                                    • 0
                                      Ещё есть зависимость от того, каков размер блоков при копировании:

                                      $ pv /dev/zero > /dev/null
                                      42,1GB 0:00:06 [7,05GB/s] [ <=> ]

                                      $ dd if=/dev/zero of=/dev/null bs=1M count=40K
                                      40960+0 записей считано
                                      40960+0 записей написано
                                      скопировано 42949672960 байт (43 GB), 4,22341 c, 10,2 GB/c

                                      $ # Ну или с перенаправлением (какая разница :)

                                      $ dd if=/dev/zero bs=1M count=40K > /dev/null
                                      40960+0 записей считано
                                      40960+0 записей написано
                                      скопировано 42949672960 байт (43 GB), 4,2467 c, 10,1 GB/c
                                      • 0
                                        Правда, надо сделать поправку на то, что pv считает GB = 230, а dd — понятно что (109). Тогда в первом тесте в терминах dd будет скорость 7.57 GB/c (всё равно разница заметна).
                                  • +2
                                    фаллометрия детектед ;)))
                                    • 0
                                      pv /dev/zero > /dev/null
                                      7GiB 0:00:08 [13,4GiB/s] [ <=> ]
                                    • +1
                                      pv /dev/zero > /dev/null
                                      67GB 0:00:19 [14,1GB/s]
                                      pv /dev/urandom > /dev/null
                                      80MB 0:01:10 [5,32MB/s]

                                      Q6600 :)
                                      • 0
                                        motherboard, ram?

                                        в целях сравнения, потому-что первый показатель у меня маловат
                                        • 0
                                          MSI MS-7379 экстрадешевая материнка
                                          Corsair XMS2 2x2 GB pc6400 C5, обычная дешевая память
                                          все в дефолте
                                          opensuse 11.1 i386

                                          Может влияет кол-во памяти?
                                      • +2
                                        У народа появился еще один прекрасный метод показать крутизну своей тачки.
                                      • 0
                                        спасибо,

                                        добавил в фавориты
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                          • –1
                                            хорошая штука, узнал о ней три дня назад, собственно тогда, когда и хотел пригласить вас на сайт, только все инвайты уже раздал.
                                            • –5
                                              пост скриптум, извините, накипело:
                                              зацените какое у нас классное сообщество, зашел в профиль автору, там написано следующее:
                                              карма +16, голосов 18, стало быть кто-то проголосовал в минус.
                                              Внимание вопрос, уважаемые знатоки, какой мудак это сделал и что им двигало, если у человека один пост(кстати, уникальный на хабре) и всё! ни комментариев, ничего… от от не#уй делать что-ли…
                                              • +3
                                                Возможна ситуация когда 1 голос != 1… ну вот както так.
                                                Я когда-то плюсовал когото и увидел что за мой 1 голос добавилось 0.59 кармы
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • +1
                                                    Это не так. В действии до сих пор, к примеру, такое правило, что при взаимном плюсовании кармы размер добавляемого значения уменьшается (то есть один человек получает единицу, а второй много меньше).
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Хорошо? Да это прекрасно! Если бы так было в реальном мире, сдается мне, он был бы куда лучше :)
                                                  • +1
                                                    Вы меня только что огорчили :) у меня после моего первого топика было около 17 голосов. Карма 7.75 если не ошибаюсь… Вот теперь думаю, чтобы это могло значить…
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                      • –2
                                                        нет, не первый, я просто не пишу ничего именно по этой причине, впринципе кармы было так много, что я не дрочил на нее не переживал, потом три поста с выходом на главную, и она уже не 77, а 50, закрыл нафиг свои посты и остался читателем, вот здесь идет в точности к тому же, хотел обратить внимание. 30 комментов — молодец, спасибо, как не хватало… среднее арифметическое говорит, что кто-то зассал сказать как есть, именно с этой тз хабр де факто учит быть крысой.
                                                        • –1
                                                          Да забейте вы на эту карму
                                                          • +2
                                                            да причем здесь карма? я же не о самих цифрах, как и писал выше — мне ее вполне хватает, чтобы голосовать, использовать html в комментариях и прочее, то есть она есть — и точка. Я говорю о поведении людей, карма в данном случае лишь как лакмусовая бумажка — по этой самой цифре можно посчитать процент п##расов
                                                            (давайте орлы, еще мне пару минусов в профиль, я это замечаю, но вы как и прежде — остались теми же жалкими тихими минусятниками)

                                                            ps: последнее — не вам, sunburd, вам я сейчас повышу (и так 3.50 на данный момент, посмотрим как поведут себя крысы — я думаю назло мне они вас поднимут :) )

                                                            И кто отминусовал выше — мне до задницы ваши мнения, я просто обращаю внимание, что мне есть что написать в постах, которые вы сами же выведете на главную, откомментите «классный метод в верстке», «клева, как я сам не додумался», но карма упадёт(проверено неединоразово), и что это значит? Что поэт сочинил стих, а его послали на йух… вот и вся арифметика, поймите правильно какие в этот момент чувства, ты вынашивал идею скажем месяц, до чего-то додумался, что-то реализовал, поделилися, а тебе за это насрали под дверью — здорово, не правда ли?
                                                            • 0
                                                              Ну любят товарищи подрочить карму :) В мою посмотрите — за 1 пост она выглядит как ноль :) Зато сколько народу сочло нужным поставить плюс или минус :) Я уже давно забил на неё — можно писать нормальные посты и уходить в минуса, можно крикнуть — «вы все быдло идитенайух» и взлететь в плюсах. Раз на раз не приходится :)
                                                      • 0
                                                        Вдруг кто-то промахнулся. У меня иногда тачпад тупит, и во время открытия хабраката спускает страничку на пару строк, после чего клац приходится на «-», что приводит к неоправдвнно опущенному мною топику. Очень обидно, но сделанного не воротишь.
                                                        • +3
                                                          В случае с кармой — воротишь.
                                                    • 0
                                                      полезная, но нетривиальная тулза )
                                                      • 0
                                                        как мне этого не хватало! спасибо!
                                                        • 0
                                                          Супер! Спасибо!
                                                          • +1
                                                            «Уже неплохо, но хочеться хочется большего»
                                                            • –1
                                                              жесть, я всегда ругался, что в unix и unix like os не хватает прогресс бара. теперь жить стало легче
                                                              • 0
                                                                Аминь.
                                                                • 0
                                                                  теперь надо: cp/mv показывали статус, ибо vcp глючное уг :)
                                                                  • +2
                                                                    Как я до этого топика дожил вообще?
                                                              • +1
                                                                Обычно сначала запускаешь cp, а потом минут через 5 понимаешь, что хотелось бы прогресс поглядеть.

                                                                Вот крутится в голове такая идейка… а нельзя ли работающему cp/mv залезть в /proc/PID, посмотреть на открытые файловые дескрипторы и на основании положения звёзд и планет угадать, в каком месте сейчас читается какой файл, посмотреть размер файла и выдать эту информацию на экран?
                                                                • 0
                                                                  Если Вы вызывали cp * blah
                                                                  то весь перечень файлов у него расширится шеллом в список аргументов, который видны в /proc
                                                                  и cp вроде как идет по-порядку. Проблем особых нет, пока не приходится копировать рекурсивно директории.
                                                                  • +1
                                                                    Во FreeBSD для этого есть Ctrl+T (SIGINFO):
                                                                    % cp tetex-texmf-3.0.tar.gz /tmp/tetex-texmf-3.0.tar.gz
                                                                    load: 0.04 cmd: cp 92881 [getblk] 0.00u 0.06s 0% 736k
                                                                    tetex-texmf-3.0.tar.gz -> /tmp/tetex-texmf-3.0.tar.gz 17%
                                                                    load: 0.04 cmd: cp 92881 [getblk] 0.00u 0.15s 0% 760k
                                                                    tetex-texmf-3.0.tar.gz -> /tmp/tetex-texmf-3.0.tar.gz 41%
                                                                    ^C

                                                                    Во время копирования файла я два раза нажал Ctrl+T. Видно, что во время первого нажатия скопировалось 17% файла, во время второго — 41%.
                                                                  • +2
                                                                    А есть ли тулза что бы смотреть состояние уже работующих пайпов?
                                                                    • +1
                                                                      Вот мне тоже очень интересно…
                                                                    • 0
                                                                      Да забавно) поююзаем.
                                                                      • 0
                                                                        некайф если du занимает столько же времени сколько tar
                                                                        • 0
                                                                          Сайт проекта pv
                                                                          Так, на всякий случай, не у всех в репах есть pv.
                                                                          • +5
                                                                            Да, pv — это must have :)

                                                                            Есть еще такое приспособление для похожих нужд: www.theiling.de/projects/bar.html

                                                                            Написано на sh.
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                            • 0
                                                                              Класс!!! Спасибо :)

                                                                              [sasha@acserv /usr/ports 0] 510> pv < /dev/zero > /dev/null
                                                                              ^C.3GB 0:00:07 [6.61GB/s] [              <=>                                                                                            ]
                                                                              

                                                                              • +1
                                                                                еще в мане написан такой пример
                                                                                (pv /dev/zero -n > /dev/null) 2>&1 | dialog --gauge Progress 7 50
                                                                                • +1
                                                                                  dialog dialog'у рознь. на разных системах
                                                                              • +1
                                                                                нда, пару раз даже сам изобретал колесо оказывается…
                                                                                • 0
                                                                                  вот она, радость простых вещей :)
                                                                                  но почему называется pipeviewer (pv), а не какой-нибудь pipeprogress (pp)?
                                                                                  • 0
                                                                                    делает замеры по времени, количеству переданной информации и скорости в пайпе :). размер файла здесь выходит на второй план.

                                                                                    ps Ваш К.О.
                                                                                  • 0
                                                                                    а нельзя это как то с «cp» и «mv» использовать, чтобы видеть прогресс копирования/перемещения, так, как это у «scp» сделано?
                                                                                    или у «cp» и «mv» есть какая нибудь опция своя?
                                                                                    • 0
                                                                                      Ну как вариант «навскидку», — прописать в .bashrc:
                                                                                      pvcp() { command /bin/cp $@ | pv ; }
                                                                                      pvmv() { command /bin/mv $@ | pv ; }

                                                                                      Ну и результат:
                                                                                      fish@bone:~$ pvcp /dev/zero /dev/null 
                                                                                        0B 0:00:03 [   0B/s ] [<=>                                 ]
                                                                                      fish@bone:~$ 

                                                                                      Назвать можете как угодно (pvcp, vcp или даже заменить стандартный cp =)

                                                                                      P.S. Возможны проблемы с аргументами, хотя у меня всё отлично работает =)
                                                                                      • 0
                                                                                        Тьфу, туплю уже =(
                                                                                        Он размер файла так не скажет…
                                                                                        • 0
                                                                                          А как тут удалить свою тупость? :D :D :D
                                                                                        • 0
                                                                                          $ pv /path/to/file/name | cat — >/output/path/file
                                                                                          • 0
                                                                                            это было копирование, а перемещение

                                                                                            $ (pv /path/to/file/name | cat — >/output/path/file) && rm -rf /path/to/file/name

                                                                                            грубо, но…
                                                                                        • 0
                                                                                          полезная штуковина — если в скриптах. а так — если логи не большие + если операцию так и так надо сделать и не важно сколько времени она займет (на диске есть место и комп включен круглосуточно) то вроде и не надо — запустил и в другую консоль работать…
                                                                                          • 0
                                                                                            А мне просто нравиться держать руку на пульсе( лучше на горле) Я в основном использую комбу pv + nc. Netcat, кстати заслуживает отдельного поста, его можно использовать очень творчески
                                                                                          • 0
                                                                                            pv /dev/zero > /dev/null
                                                                                            2GB 0:00:20 [3,25GB/s] [ <=> ]
                                                                                            pv /dev/urandom > /dev/null
                                                                                            1MB 0:00:11 [3,93MB/s] [ <=> ]

                                                                                            У FreeBSD, похоже, генератор случайных чисел бодрее: даже на древних машинах pv /dev/urandom > /dev/null даёт не три, а целых тридцать MB/s!
                                                                                            • 0
                                                                                              а есть похожая тулза для CP?

                                                                                              cp file1 file2?

                                                                                              а то бывает копируешь 20Гб файл… и думаешь… а сколько еще осталось :)
                                                                                            • 0
                                                                                              а для mysql, когда из дампа востанавливаешь, можно ее добавить:
                                                                                              mysql -p database < dump.sql?
                                                                                              • 0
                                                                                                pv dump.sql | mysql -p database
                                                                                                • 0
                                                                                                  Спасибо за ответ, вот только нужно с паролем вводить:
                                                                                                  pv dump.sql | mysql -proot database

                                                                                                  в другом случае pv работает некорректно:

                                                                                                  Enter password: 64kB 0:00:01 [ 63kB/s]
                                                                                                  64kB 0:00:03 [ 0B/s ] ] 0% ETA 13:01:12
                                                                                                  4.5MB 0:00:15 [ 787kB/s] [> ] 0% ETA 0:54:00
                                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                              • +2
                                                                                                emerge -pv pv
                                                                                                • 0
                                                                                                  Столкнулся с подобной проблемой и наткнулся на этот пост.

                                                                                                  Автор, дай бог тебе здоровья, а!

                                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.