Как вы отслеживаете ход работы dd?

555

dd - это чудо. Он позволяет дублировать жесткий диск на другом, полностью нулевой жесткий диск и т. Д. Но как только вы запустите команду dd , вам нечего сказать о ее прогрессе. Он просто сидит там под курсором, пока команда окончательно не завершится. Итак, как можно отслеживать прогресс dd?

    
задан James 10.11.2012 в 21:24
источник

19 ответов

396

Из HowTo: отслеживать ход dd

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

Чтобы просмотреть ход dd после его запуска, откройте другой терминал и введите:

sudo kill -USR1 $(pgrep ^dd)

В окне dd отобразится dd , не останавливая процесс. Если вы используете BSD или OS X, используйте INFO вместо USR1 . Сигнал USR1 завершит dd.

Если вы хотите получать регулярные обновления прогресса dd , введите:

watch -n5 'sudo kill -USR1 $(pgrep ^dd)'

watch будет проверять процесс dd каждый -n секунд ( -n5 = 5 секунд) и сообщать, не останавливая его.

Обратите внимание на правильные одинарные кавычки в приведенных выше командах.

    
ответ дан James 10.11.2012 в 21:44
источник
610

Обновление 2016 . Если вы используете GNU coreutils > = 8.24 (по умолчанию в Ubuntu Xenial 16.04 вверх), см. метод 2 ниже для альтернативного способа отображения прогресса .

Способ 1. Используя pv

Установите pv и поместите его между командами ввода / вывода dd .

Примечание : вы не можете использовать его, когда вы уже начали dd .

Из описания пакета :

pv - Pipe Viewer - is a terminal-based tool for monitoring the progress of data through a pipeline. It can be inserted into any normal pipeline between two processes to give a visual indication of how quickly data is passing through, how long it has taken, how near to completion it is, and an estimate of how long it will be until completion.

Установка

sudo apt-get install pv

Пример

dd if=/dev/urandom | pv | dd of=/dev/null

Выход

1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]

Вы можете указать приблизительный размер с --size , если хотите оценить время.

Пример Предположим, что 2GB-диск скопирован из / dev / sdb

Команда без pv будет:

sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096

Команда с pv :

sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096

Вывод:

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Другие использования

Вы можете, конечно, использовать pv напрямую для вывода вывода на стандартный вывод:

pv /home/user/bigfile.iso | md5sum

Выход

50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06

Обратите внимание, что в этом случае pv автоматически распознает размер.

Способ 2: Добавлена опция status в dd (GNU Coreutils 8.24 +)

dd в GNU Coreutils 8.24+ (Ubuntu 16.04 и новее) получил новую status для отображения прогресса:

Пример

dd if=/dev/urandom of=/dev/null status=progress

Выход

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
    
ответ дан phoibos 11.11.2012 в 03:04
88

Несколько удобных примеров использования pv и меньше набрав или больше прогресса, чем другие ответы:

Сначала вам нужно будет установить pv , с командой:

sudo apt-get install pv

Тогда некоторые примеры:

pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror

Примечание: первый пример состоит из 5 символов, а затем dd if=/dev/urandom | pv | dd of=/dev/null .

И мой любимый для клонирования диска:

(pv -n /dev/sda | dd of=/dev/sdb bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0

источник: Ссылка

Также для архивирования.

    
ответ дан JSBach 27.08.2014 в 16:01
56

Используйте Ctrl + Shift + T , в то время как dd запущено, и он выведет прогресс (в байтах):

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
    
ответ дан 01010101 17.10.2014 в 16:15
45

Для полноты:

Версия 8.24 из GNU coreutils содержит патч для dd, вводящий параметр для печати прогресса.

У коммита , представляющего это изменение, есть комментарий

dd: new status=progress level to print stats periodically

Многие дистрибутивы, включая Ubuntu 16.04.2 LTS , используют эту версию.

    
ответ дан davidDavidson 15.10.2015 в 11:24
31

Лучше всего использовать Ссылка , которую легко установить с помощью apt-get

    
ответ дан TheNano 12.03.2013 в 15:11
22

В dd был добавлен родной статус прогресса.

Новая версия Coreutils (8.24) добавляет статус прогресса в инструмент dd :

Использование Xubuntu 15.10:

Откройте терминал и введите следующие команды:

wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)

Запустите dd от имени пользователя root:

sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress

Вы увидите: байты, секунды и скорость (байты / секунда).

Чтобы проверить версии dd :

Native:

dd --version

Новое:

cd coreutils-8.24/src
./dd --version
    
ответ дан user3394963 30.12.2015 в 17:29
16

Если вы уже запустили dd, и если вы пишете файл, например, при создании копии pendrive на диск, вы можете использовать команду watch, чтобы постоянно наблюдать размер выходного файла, чтобы видеть изменения и оценивать завершение .

watch ls -l /pathtofile/filename

Чтобы увидеть только размер файла (h-human view):

watch ls -sh /pathtofile/filename
    
ответ дан fabricator4 07.12.2012 в 22:46
11

Триада dd | pv | dd сделала мою копию объемом 50GB vm за 800 секунд, в отличие от 260 секунд, используя только dd. С этим конвейером, по крайней мере, pv не имеет представления о том, насколько велик входной файл, поэтому он не сможет рассказать вам, насколько далеко вы находитесь, поэтому нет никакого недостатка в этом, как показано ниже, и вы получаете хорошее преимущество скорости:

Я бы избегал pv на любом большом и (если использовал Bash):

Контроль-Z процесс dd

bg , чтобы поместить его в фоновом режиме. Обратите внимание, что bg даст вам выход, например [1] 6011 , где последний номер является идентификатором процесса. Итак, do:

while true; do kill -USR1 process_id ; sleep 5; done

где process_id - это идентификатор процесса, который вы наблюдали. Hit Control-C, когда вы видите что-то вроде:

[1]+  Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process

Вы закончили.

Изменить: Silly Systems Administrator! Автоматизируйте свою жизнь, не работайте! Если у меня есть длинный dd-процесс, который я хочу контролировать, вот один лайнер, который позаботится обо всем энчилада для вас; поместите это все в одну строку:

 dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done

Вы можете, конечно, сценарий, возможно, сделать $ 1 ваш входной файл и $ 2 ваш выходной файл. Это остается как упражнение для читателя. Обратите внимание, что вам нужен этот маленький сон перед убийством или смерть может умереть, чтобы отправить сигнал на dd, когда он еще не готов. Отрегулируйте свои спящие по желанию (возможно, вообще удалите второй сон).

Bash- FTW! : -)

    
ответ дан Mike S 06.05.2015 в 20:32
10

Ссылка

В принципе:

kill -USR1 < dd pid >
    
ответ дан hnasarat 10.11.2012 в 21:30
6

В Ubuntu 16.04

Ubuntu 16.04 поставляется с версией dd (coreutils) версии 8.25 . Следовательно, опция status=progress - Поддерживается: -)

Чтобы использовать его, просто добавьте status=progress вместе с вашей командой dd .

Пример:

dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync

Дает статус

1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s

    
ответ дан Severus Tux 25.06.2016 в 06:54
6

Самый простой:

 dd if=... of=... bs=4M status=progress oflag=dsync

oflag=dsync будет синхронизировать вашу запись, поэтому информация status=progress более точная. Однако это может быть немного медленнее.

    
ответ дан zevero 04.10.2016 в 08:46
3

Я создал обертку bash над dd , которая будет использовать pv , чтобы показать прогресс. Поместите его в свой .bashrc и используйте dd , как обычно:

# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
    2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%            
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s

Источник:

dd()
{
    local dd=$(which dd); [ "$dd" ] || {
        echo "'dd' is not installed!" >&2
        return 1
    }

    local pv=$(which pv); [ "$pv" ] || {
        echo "'pv' is not installed!" >&2
        "$dd" "[email protected]"
        return $?
    }

    local arg arg2 infile
    local -a args
    for arg in "[email protected]"
    do
        arg2=${arg#if=}
        if [ "$arg2" != "$arg" ]
        then
            infile=$arg2
        else
            args[${#args[@]}]=$arg
        fi
    done

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}
    
ответ дан midenok 20.10.2014 в 13:32
3

Мне очень нравится ddrescue, он работает как dd, но дает результат и не терпит неудачу при ошибках, напротив, имеет очень продвинутый алгоритм, который действительно пытается сделать успешную копию ... Есть также много графических интерфейсов для это

Проект: Ссылка

Википедия: Ссылка

    
ответ дан SuperMau 17.02.2016 в 06:55
2

Итак, сегодня я немного разочаровался в попытке запустить kill в цикле, пока работал dd , и придумал этот метод для их параллельного запуска:

function vdd {
    sudo dd "[email protected]" &
    sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}

Теперь просто используйте vdd в любом месте, где обычно вы используете dd (он передает все аргументы напрямую), и вы получите отчет о проделанной работе каждые 5 секунд.

Единственным недостатком является то, что команда не возвращается сразу после завершения dd; поэтому возможно, что эта команда заставит вас ждать дополнительных 5 секунд после возвращения dd, прежде чем она заметит и выйдет.

    
ответ дан robru 11.04.2014 в 02:41
2

Используйте опцию status=progress , чтобы получить прогресс во время переноса.

Кроме того, conv=fsync будет отображать ошибки ввода / вывода.

Пример:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
    
ответ дан MUY Belgium 25.05.2018 в 13:38
1

Как упоминалось выше, по крайней мере, с 'dd' от GNU coreutils или busybox, он будет реагировать на сигнал USR1, распечатывая информацию о ходе до stderr.

Я написал небольшой скрипт-оболочку для dd, который показывает хороший индикатор процента, и пытается каким-либо образом не мешать процессу или способу dd. Вы можете найти его на github:

Ссылка

К сожалению, этот трюк SIGUSR1 работает только с GNU dd (из пакета coreutils) или в режиме «dd» busybox с той специфической функцией, которая включена во время компиляции. Он не работает с запасом «dd», включенным в большинство систем BSD, включая FreeBSD и OS X ...: (

    
ответ дан delt 10.09.2015 в 08:29
1

Это заставляет dd предоставлять статистику каждые 2 секунды, которая по умолчанию используется для просмотра:

watch killall -USR1 dd

Чтобы изменить каждые 2 секунды каждые 5 секунд, добавьте параметр -n 5, например:

watch -n 5 killall -USR1 dd
    
ответ дан Kostyantyn 30.01.2018 в 21:24
1

Вы можете следить за ходом любой программы coreutils, используя progress - Coreutils Progress Viewer .

Он может контролировать:

cp mv dd tar cat rsync grep fgrep egrep cut sort md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unlzma 7z 7za zcat bzcat lzcat split gpg

Вы можете увидеть manpage

Вы можете использовать его в отдельном окне терминала во время выполнения команды или запустить ее с помощью команды dd:

dd if=/dev/sda of=file.img & progress -mp $!

Здесь & выдает первую команду и продолжает немедленно, а не ждать окончания команды.

Команда выполнения запускается с: -m , поэтому она ждет, пока процесс мониторинга не завершится, -p , поэтому он контролирует данный pid, а $! - последняя команда pid.

Если вы выдаете dd с помощью sudo, вам тоже нужно идти вперед:

sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid
    
ответ дан labsin 22.07.2018 в 22:06