Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

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