Пользователь
0,0
рейтинг
25 июля 2009 в 21:19

Администрирование → 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] [...<=>............................]
@Yur4eg
карма
90,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (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'у рознь. на разных системах
      • 0
        есть еще gtk и qt версии
  • +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Гб файл… и думаешь… а сколько еще осталось :)
    • +1
      watch -n 1 ls -l /path/to/file :)
  • 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
    Столкнулся с подобной проблемой и наткнулся на этот пост.

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

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