Como você monitora o progresso do dd?

dd é uma maravilha. Ele permite duplicar um disco rígido para outro, zerar completamente um disco rígido,etc. Mas uma vez que você lançar um dd comando, não há nada para lhe dizer sobre o seu progresso. Ele apenas fica lá no cursor até que o comando finalmente termine. Então, como monitorar o progresso do dd?

Atualização 2016>: Se você usar GNU coreutils = 8.24 (padrão no Ubuntu Xenial 16.04 para cima), consulte o método 2 abaixo para uma maneira alternativa de exibir o progresso.


Método 1: usando pv

Instalar pv e colocá-lo entre entrada / saída apenas dd comando.

Notar: você não pode usá-lo quando você já começou dd.

De a descrição do pacote:

pv - Pipe Viewer - é uma ferramenta baseada em terminal para monitorar o progresso dos dados através de um pipeline. Ele pode ser inserido em qualquer pipeline normal entre dois processos para dar uma indicação visual de quão rapidamente os dados estão passando, quanto tempo demorou, quão perto da conclusão é e uma estimativa de quanto tempo será até a conclusão.

Instalacao

sudo apt-get install pv

Exemplo

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

Saida

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

Você pode especificar o tamanho aproximado com o --size se você quer uma estimativa de tempo.


Exemplo assumindo que um disco de 2 GB está sendo copiado de / dev / sdb

Comando sem pv seria:

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

Comando com pv:

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

Saida:

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

Utilizacao

Você pode, claro, usar pv diretamente para canalizar a saída para stdout:

pv /home/user/bigfile.iso | md5sum

Saida

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

Observe que, neste caso, pv reconhece o tamanho automaticamente.


Método 2: Novo status Opção adicionada a dd (GNU Coreutils 8.24+)

dd em GNU Coreutils 8.24+ (Ubuntu 16.04 e mais recente) tem um novo status opção para exibir o progresso:

Exemplo

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

Saida

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

De HowTo: monitore o progresso do dd

Você pode monitorar o progresso do dd uma vez que está funcionando sem interrompê-lo usando o kill comando para enviar um sinal para o processo.

Depois de começar dd, abra outro terminal e entre ou:

sudo kill -USR1 $(pgrep ^dd$)

Ou, se você estiver no BSD ou OS X:

sudo kill -INFO $(pgrep ^dd$)

Isso exibirá o progresso no dd janela do terminal sem interromper o processo (imprimindo em seu fluxo stderr). Por exemplo:

# dd if=/dev/urandom of=rando bs=1024 count=1048576335822+0 records in335821+0 records out343880704 bytes (344 MB, 328 MiB) copied, 6.85661 s, 50.2 MB/s

Se você gostaria de obter atualizações regulares do dd progresso e, em seguida, entrar:

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

watch vai sondar o dd processo a cada-n segundos (-n5 = 5 segundos) e relatar sem interrompê-lo.

Observe as aspas únicas adequadas nos comandos acima.

Alguns usos úteis da amostra com pv e menos digitação ou mais progresso do que outras respostas:

Primeiro você precisará instalar pv, com o comando:

sudo apt-get install pv

Então alguns exemplos são:

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

Nota: a primeira amostra é de 5 caracteres menos digitando então dd if=/dev/urandom | pv | dd of=/dev/null.

E meu favorito para clonar uma unidade de disco (substitua X por letras de unidade):

(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

fonte: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

Também para me arquivar.

Por uma questão de Completude:

Versao 8.24 do GNU coreutils inclui um patch para DD introduzindo um parâmetro para imprimir o progresso.

O commit apresentando esta mudança tem o comentário:

dd: novo status = progresso nível para imprimir estatísticas periodicamente

Muitas distribuições, incluindo Ubuntu 16.04.2 LTS use esta versão.

Usar Ctrl+Shift+T enquanto dd está em execução e produzirá o progresso (em bytes):

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s321121+0 records in321120+0 records out164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)

O melhor é usar http://dcfldd.sourceforge.net/ é fácil de instalar através do apt-get

O status de progresso nativo foi adicionado ao dd!!!

A nova versão do Coreutils (8.24) adiciona um status de progresso ao dd ferramenta:

Uso no Xubuntu 15.10:

Abra um terminal e digite esses comandos:

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

Executar dd como raiz:

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

Você verá: Bytes, segundos e velocidade (Bytes/segundo).

Para verificar as versões do dd:

Nativo:

dd --version

Novo:

cd coreutils-8.24/src./dd --version

Se você já iniciou o dd e, se estiver gravando um arquivo, como ao criar uma cópia de um pendrive no disco, poderá usar o comando watch para observar constantemente o tamanho do arquivo de saída para ver as alterações e estimar a conclusão.

watch ls -l /pathtofile/filename

Para ver apenas o tamanho do arquivo (H-human view):

watch ls -sh /pathtofile/filename

O dd | pv | dd a tríade fez minha cópia de vm de 50 GB demorar 800 segundos, em oposição a 260 segundos usando apenas dd. Com esse pipeline, pelo menos, o pv não tem ideia de quão grande é o arquivo de entrada, então não será capaz de dizer o quão longe você está, então não há desvantagem em fazê-lo da seguinte maneira - e você obtém uma boa vantagem de velocidade:

Eu evitaria pv em qualquer coisa grande e (se estiver usando Bash):

Control - Z O processo dd

bg para colocá-lo em segundo plano. Observe que bg vai lhe dar saída como [1] 6011 onde o último número é um ID de processo. Então, faça:

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

onde process_id é o ID do processo que você observou. Hit Control-C quando você vê algo como:

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

Já acabaste.

Editar: Administrador De Sistemas Bobo! Automatize sua vida, não trabalhe! Se eu tiver um longo processo dd que quero monitorar, aqui está um one-liner que cuidará de toda a enchilada para você; coloque tudo isso em uma linha:

 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

Você pode, é claro, script-lo, talvez fazer $1 seu arquivo de entrada e $2 seu arquivo de saída. Isso é deixado como um exercício para o leitor. Note que você precisa que pouco sono antes da morte ou a morte pode morrer tentando enviar um sinal para dd quando ainda não está pronto. Ajuste seus dormidos conforme desejado(talvez até remova o segundo sono completamente).

Bash-FTW! :-)

http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

Basicamente:

kill -USR1 < dd pid >