It-e.RU
Цифровой двигатель вашего бизнеса.

pipe viewer: прогресс бар в консоли

pipe viewer: прогресс бар в консоли

pipe viewer: прогресс бар в консоли


Очень часто встречается проблема долгого выполнения команд в консоли и самый обыденный пример - это mysqldump. Было бы очень неплохо выводить более подробную информацию о том, как выполняется наша команда и сколько ещё ждать до завершения, и на помощь приходит утилита pv - pipe viewer.

Начнем с оценки времени:

mysql1 makky # time mysqldump -u root -p db_name --single-transaction > db_name-`date +%w`.sql
Enter password: 

real    0m39.948s
user    0m22.732s
sys     0m1.888s
mysql1 makky # ls -la db_name-`date +%w`.sql
-rw-r--r-- 1 root root 2093269453 май 29 15:05 db_name-4.sql
mysql1 makky # ls -lha db_name-`date +%w`.sql
-rw-r--r-- 1 root root 2,0G май 29 15:05 db_name-4.sql

Вот я выяснил, что дамп снимается около 40 секунд и имеет размер 2Гб. Разворачиваться такой дамп будет очень долго. Можно было бы сделать вот так:

mysql1 makky # mysqldump -u root -p db_name --single-transaction  | pv -s 2G > db_name-`date +%w`.sql
1,95GiB 0:00:29 [67,3MiB/s] [==========================================================================================================================================>     ] 97%            
mysql1 makky #

Это уже намного интереснее, но я знал какой объём данных должен быть. Но это пример использования утилиты pv. Размер можно было указать и как 2093269453 (его мы видели выше). Теперь надо дамп развернуть:

mysql1 makky # pv db_name-4.sql | mysql -u root -p db_name
 254MiB 0:01:31 [ 3,1MiB/s] [=================>                                                                                                                              ] 13% ETA 0:09:28

Есть прогрессбар и примерное время выполнения.

Несколько примеров.
Архивирование файлов:

pv access.log | gzip > access.log.gz
811MB 0:00:11 [68.3MB/s] [=>      ] 13% ETA 0:00:59

Здесь pv сработал как cat.
Вот ещё подобный пример:

tar -czf - . | pv > out.tgz

А здесь pv также работает как cat, но через именнованный канал -N:

pv -cN source access.log | gzip | pv -cN gzip > access.log.gz

Очень полезный пример. Здесь мы пакуем текущую директорию, сравнивая её размер:

tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > out.tgz

Передача файла с удаленной машины с сжатием:

ssh makky@server "cat dump.sql | gzip -c" | pv | gunzip > ~/dump.sql

Вот достаточно сложный пример (пример не мой, я нашел его в сети): На локальной машине выполняем:

$ tar -cf - /path/to/dir | pv | nc -l -p 2222 -q 5

На удаленной:

$ nc ИП 2222 | pv | tar -xf -

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


Пожалуйста, уважайте труд автора, при копировании материалов сохраняйте ссылку на источник!

Комментарии (0)



Добавление комментариев закрыто.