Библиотека сайта rus-linux.net
Peter Leung, "Командная строка: маленькие хитрости от Linux Commando"
Как узнать о ходе процесса копирования командой dd?
Оригинал: Show progress during dd copyАвтор: Peter Leung
Дата: 5 июня 2008
Свободный перевод: Алексей Дмитриев
Дата перевода: 21 июля 2010
Популярная, многофункциональная команда dd часто служит для копирования файлов с одного места в другое. Применяется для копирования целых разделов и даже дисков.
Как и многие другие команды, она молча работает, если не случится ничего непредвиденного. Отсутствие видимого отклика очень удобно для использования команды в скриптах. Однако, когда копируются большие файлы, хочется иметь представление о ходе процесса.
Для примера: можно заставить dd копировать случайно генерируемые числа в "черную дыру" ≈ действие абсолютно бесполезное, зато наглядное.
$ dd if=/dev/random of=/dev/null bs=1K count=100
Выполнение этой команды займет несколько минут, пока команда скопирует (и немедленно сбросит) 100 блоков по 1Кб каждый.
Чтобы получить от работающей программы отчет о ходе процесса, нужно открыть второй терминал и послать специальный USR1 сигнал процессу dd.
Для начала нужно узнать ID этого процесса. Во втором терминале набираем:
$ pgrep -l '^dd$' 8789 dd
- Примечание переводчика: Данное в одинарных кавычках регулярное выражение означает "выражение начинается с dd и заканчивается dd", другими словами, искать только dd безо всяких других букв спереди или сзади. Почему это так, вы поймете, запустив альтернативную команду:
$ pgrep -l dd 2 kthreadd 3901 pccardd 5200 btaddconn 5335 hald-addon-inpu 5340 hald-addon-alsa 5346 hald-addon-cpuf 5347 hald-addon-acpi 5353 hald-addon-alsa 5371 hald-addon-stor 5385 hald-addon-gene 8789 dd
Вот сколько процессов имеют в своем названии "dd"!
Осталось послать процессу 8789 сигнал USR1:
$ kill -USR1 8789
Как только вы пошлете сигнал, команда dd, продолжающая копирование в первом терминале, отреагирует, выдав текущую статистику на STDERR (Стандартный поток сообщений об ошибках).
$ dd if=/dev/random of=/dev/null bs=1K count=100 0+14 records in 0+14 records out 204 bytes (204 B) copied, 24.92 seconds, 0.0 kB/s
Выдав это сообщение, программа dd возобновит копирование. Можете повторять команду kill столько раз, сколько вам нужно. А можете применить команду watch, которая будет запускать команду kill с указанными вами интервалами:
$ watch -n 10 kill -USR1 8789