Как вы контролируете прогресс дд?

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

765
задан 2 October 2016 в 05:00

20 ответов

с HowTo: Отследить прогресс dd

Вы можете, не останавливая его, с помощью команды kill.

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

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 секунд) и сообщите об этом, не останавливая его.

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

514
ответ дан 2 October 2016 в 05:00

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

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

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

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

2
ответ дан 2 October 2016 в 05:00

Вы можете наблюдать за прогрессом любой программы 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 unlzip2 bunzip2 xz unxz lzma unlzma unlzcatma 7z lsg [2] [2] 12174] Вы можете использовать его в отдельном окне терминала во время выполнения команды или запустить с помощью команды 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
1
ответ дан 2 October 2016 в 05:00

На случай, если кто-нибудь из CentOS найдет эту ветку ...

Параметр 'status = progress' работает с CentOS 7.5 и 7.6

Приведенный выше ответ @davidDavidson подразумевает, что эта функция была недавно добавлена ​​в Coreutils 8.24.

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

Это может иметь место, но CentOS может не следует той же схеме управления версиями.

Версия Coreutils, которая поставляется с CentOS 7.6.1810:

coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts

И установленная версия dd:

[root@hostname /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, David MacKenzie, and Stuart Kemp.

Здесь показаны версии 8.22 .

Тем не менее, я протестировал 'status = progress' с dd как на CentOS 7.5, так и на CentOS 7.6 (обе с Coreutils версии 8.22), и он работает правильно.

Я не знаю, почему RedHat решает использовать такие старая версия Coreutils, но функциональность существует в версии 8.22.

2
ответ дан 2 October 2016 в 05:00

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

watch killall -USR1 dd

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

watch -n 5 killall -USR1 dd
4
ответ дан 2 October 2016 в 05:00

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


Метод 1: Используя pv

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

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

С описание пакета :

pv - Pipe Viewer - это клемма-основанный на инструменте мониторинга ход обработки данных по трубопроводу. Его можно вставить в любой обычный трубопровод между двумя процессами для визуального отображения как быстро проходят данные, сколько времени это заняло, как близко... чтобы закончить его, и оценить, как долго это будет продолжаться до тех пор. Завершение.

Installation

sudo apt-get install pv

Example

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

Output

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

Можно задать примерный размер с помощью --size, если необходимо вычислить время.


Пример допущения, что диск объемом 2 ГБ копируется из команды /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 непосредственно для вывода в stdout:

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

Output

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
821
ответ дан 2 October 2016 в 05:00

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

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

http://github.com/delt01/dd_printpercent

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

1
ответ дан 2 October 2016 в 05:00

Я создал оболочку 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" "$@"
        return $?
    }

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

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}
3
ответ дан 2 October 2016 в 05:00

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

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

Пример :

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
7
ответ дан 2 October 2016 в 05:00

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

Проект: https://www.gnu.org/software/ddrescue

Википедия : https://en.wikipedia.org/wiki/Ddrescue

enter image description here

4
ответ дан 2 October 2016 в 05:00

На Ubuntu 16.04

Ubuntu 16.04 поставляется с dd (coreutils) Версия 8.25 . Поэтому опция status=progress is Supported :-)

Чтобы использовать ее, просто добавьте 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

enter image description here

8
ответ дан 2 October 2016 в 05:00

Самый простой вариант:

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

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

7
ответ дан 2 October 2016 в 05:00
12
ответ дан 2 October 2016 в 05:00

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

Я бы избежать pv на что-нибудь большое, и (при использовании Bash):

Control-Z процесс dd

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

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

where process_id - id процесса, который Вы наблюдали. Нажмите на Control-C, когда увидите что-то вроде:

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

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

Правка: Глупый системный администратор! Автоматизируйте свою жизнь, не работайте! Если у меня длинный процесс 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, когда оно еще не готово. Настройте сон по желанию (может быть, даже удалить второй сон вообще).

Баш FTW! :-)

13
ответ дан 2 October 2016 в 05:00

В 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 :

Собственный:

dd --version

Новый:

cd coreutils-8.24/src
./dd --version
30
ответ дан 2 October 2016 в 05:00

Déi bescht benotzt http://dcfldd.sourceforge.net/ et ass einfach duerch apt-get

36
ответ дан 2 October 2016 в 05:00

Ради полноты:

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

Коммит , вводящий это изменение, имеет комментарий:

dd: новый уровень status=progress для печати статистики периодически

Многие дистрибутивы, в том числе Ubuntu 16. 04.2 LTS используйте эту версию.

69
ответ дан 2 October 2016 в 05:00

Используйте 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)
70
ответ дан 2 October 2016 в 05:00

Несколько удобных примеров использование с 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 .

И мой любимый вариант для клонирования диска (замените X буквами дисковода):

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

screenshot

источник: http://www.cyberciti.biz/faq/ linux-unix-dd-command-show-progress-while-coping /

Также для архивации самого себя.

112
ответ дан 2 October 2016 в 05:00

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

watch ls -l /pathtofile/filename

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

watch ls -sh /pathtofile/filename
19
ответ дан 2 October 2016 в 05:00

Другие вопросы по тегам:

Похожие вопросы: