¿Cómo se monitorea el progreso de dd?

548

dd es una maravilla. Le permite duplicar un disco duro a otro, completamente cero un disco duro, etc. Pero una vez que inicia un comando dd , no hay nada que le diga de su progreso. Simplemente se sienta allí en el cursor hasta que el comando finalmente termine. Entonces, ¿cómo se monitorea el progreso de dd?

    
pregunta James 10.11.2012 - 21:24

19 respuestas

393

De HowTo: supervisa el progreso de dd

Puede controlar el progreso de dd sin detenerlo utilizando el comando kill .

Para ver el progreso de dd una vez que se está ejecutando, abre otra terminal e ingresa:

sudo kill -USR1 $(pgrep ^dd)

Esto mostrará dd progress en la ventana del terminal dd sin detener el proceso. Si tienes BSD o OS X, usa INFO en vez de USR1 . La señal USR1 terminará dd.

Si desea obtener actualizaciones periódicas del progreso de dd , ingrese:

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

watch sondeará el proceso dd cada -n segundos ( -n5 = 5 segundos) e informará sin detenerlo.

Tenga en cuenta las comillas simples correctas en los comandos anteriores.

    
respondido por el James 10.11.2012 - 21:44
598

Actualizar 2016 : si usa GNU coreutils & gt; = 8.24 (predeterminado en Ubuntu Xenial 16.04 en adelante), consulte el método 2 a continuación para obtener una forma alternativa de mostrar el progreso .

Método 1: al usar pv

Instale pv y póngalo entre los comandos de entrada / salida solo dd .

Nota : no puede usarlo cuando ya comenzó dd .

De la descripción del paquete :

  

pv - Pipe Viewer - es una herramienta basada en terminal para monitorear el   progreso de datos a través de una tubería. Se puede insertar en cualquier   tubería normal entre dos procesos para dar una indicación visual de   qué tan rápido pasan los datos, cuánto tiempo ha tardado, qué tan cerca   hasta su finalización, y una estimación de cuánto tiempo pasará hasta   finalización.

Instalación

sudo apt-get install pv

Ejemplo

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

Salida

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

Puede especificar el tamaño aproximado con --size si desea una estimación de tiempo.

Ejemplo Suponiendo que se está copiando un disco de 2 GB de / dev / sdb

El comando sin pv sería:

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

Comando con pv :

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

Salida:

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

Otros usos

Por supuesto, puede usar pv directamente para canalizar la salida a stdout:

pv /home/user/bigfile.iso | md5sum

Salida

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

Tenga en cuenta que en este caso, pv reconoce el tamaño automáticamente.

Método 2: nueva opción status añadida a dd (GNU Coreutils 8.24 +)

dd en GNU Coreutils 8.24+ (Ubuntu 16.04 y posterior) obtuvo una nueva opción status para mostrar el progreso:

Ejemplo

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

Salida

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
    
respondido por el phoibos 11.11.2012 - 03:04
87

Algunos ejemplos útiles de uso con pv y menos tipeo o más progreso y otras respuestas:

Primero necesitarás instalar pv , con el comando:

sudo apt-get install pv

Luego, algunos ejemplos son:

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

Nota: la primera muestra tiene 5 caracteres menos y luego dd if=/dev/urandom | pv | dd of=/dev/null .

Y mi favorito para clonar una unidad de disco:

(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

fuente: enlace

También para archivarme a mí mismo.

    
respondido por el JSBach 27.08.2014 - 16:01
56

Use Ctrl + Shift + T mientras dd se está ejecutando, y generará el progreso (en bytes):

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)
    
respondido por el 01010101 17.10.2014 - 16:15
44

En aras de la exhaustividad:

Versión 8.24 de los nucleutils de GNU incluye un parche para dd que introduce un parámetro para imprimir el progreso.

El compromiso al introducir este cambio tiene el comentario :

  

dd: nuevo nivel estado = progreso para imprimir estadísticas periódicamente

Muchas distribuciones, incluyendo Ubuntu 16.04.2 LTS usan esta versión.

    
respondido por el davidDavidson 15.10.2015 - 11:24
31

Lo mejor es usar enlace , es fácil de instalar a través de apt-get

    
respondido por el TheNano 12.03.2013 - 15:11
22

El estado de progreso nativo se agregó a dd !!!

La nueva versión de Coreutils (8.24) agrega un estado de progreso a la herramienta dd :

Uso en Xubuntu 15.10:

Abre una terminal y escribe estos comandos:

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)

Ejecute dd como raíz:

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

Verá: Bytes, segundos y velocidad (Bytes / segundo).

Para verificar las versiones de dd :

Nativo:

dd --version

Nuevo:

cd coreutils-8.24/src
./dd --version
    
respondido por el user3394963 30.12.2015 - 17:29
16

Si ya ha iniciado dd, y si está escribiendo un archivo como al crear una copia de un pendrive en el disco, puede usar el comando watch para observar constantemente el tamaño del archivo de salida para ver los cambios y estimar la finalización .

watch ls -l /pathtofile/filename

Para ver solo el tamaño del archivo (h-vista humana):

watch ls -sh /pathtofile/filename
    
respondido por el fabricator4 07.12.2012 - 22:46
11

El dd | pv | dd triad hizo que mi copia de 50GB vm dure 800 segundos, en comparación con 260 segundos con dd. Con esta interconexión, al menos, pv no tiene idea de cuán grande es el archivo de entrada, por lo que no podrá decirle qué tan avanzado está, por lo que no hay inconveniente para hacerlo de la siguiente manera y obtendrá una buena ventaja de velocidad:

Evitaría pv en cualquier cosa grande, y (si uso Bash):

Control-Z el proceso dd

bg para ponerlo en segundo plano. Observe que bg le dará salida como [1] 6011 donde este último número es una identificación de proceso. Entonces, hazlo:

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

donde process_id es la identificación del proceso que observó. Pulse Control-C cuando vea algo como:

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

Has terminado.

Edit: Silly Systems Administrator! ¡Automatiza tu vida, no trabajes! Si tengo un proceso de dd largo que quiero monitorear, aquí hay un trazador de líneas que se encargará de toda la enchilada para usted; pon todo esto en una línea:

 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

Puede, por supuesto, guiarlo, tal vez hacer $ 1 su archivo de entrada y $ 2 su archivo de salida. Esto se deja como un ejercicio para el lector. Tenga en cuenta que necesita dormir un poco antes de matar o la muerte puede morir tratando de enviar una señal a dd cuando todavía no está listo. Ajuste su sueño como desee (tal vez incluso elimine por completo el segundo sueño).

Bash-FTW! : -)

    
respondido por el Mike S 06.05.2015 - 20:32
10

enlace

Básicamente:

kill -USR1 < dd pid >
    
respondido por el hnasarat 10.11.2012 - 21:30
6

En Ubuntu 16.04

Ubuntu 16.04 viene con dd (coreutils) Versión 8.25 . Por lo tanto, la opción status=progress es compatible : -)

Para usarlo, solo agrega status=progress junto con tu comando dd .

Ejemplo:

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

Da el estado como

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

    
respondido por el Severus Tux 25.06.2016 - 06:54
6

Lo más fácil es:

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

oflag=dsync mantendrá su escritura sincronizada, por lo que la información de status=progress es más precisa. Sin embargo, podría ser un poco más lento.

    
respondido por el zevero 04.10.2016 - 08:46
3

He creado bash wrapper sobre dd que usará pv para mostrar el progreso. Póngalo en su .bashrc y use dd como de costumbre:

# 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

Fuente:

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[@]}"
}
    
respondido por el midenok 20.10.2014 - 13:32
3

Realmente me gusta ddrescue, funciona como dd pero da salida y no falla en los errores, por el contrario tiene un algoritmo muy avanzado y es muy difícil hacer una copia exitosa ... También hay muchas GUI para es

Proyecto: enlace

Wikipedia: enlace

    
respondido por el SuperMau 17.02.2016 - 06:55
2

Así que hoy me sentí un poco frustrado al tratar de ejecutar kill en un ciclo mientras dd se estaba ejecutando, y se me ocurrió este método para ejecutarlos en paralelo, fácilmente:

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

Ahora solo usa vdd en cualquier lugar que normalmente usarías dd (pasa todos los argumentos directamente) y obtendrás un informe de progreso impreso cada 5 s.

El único inconveniente es que el comando no regresa inmediatamente cuando termina dd; por lo tanto, es posible que este comando pueda hacer que espere un 5s adicional después de que dd regrese antes de que lo note y salga.

    
respondido por el robru 11.04.2014 - 02:41
1

Como se mencionó anteriormente, al menos con el 'dd' de GNU coreutils, o busybox, responderá a una señal USR1 imprimiendo información de progreso en stderr.

Escribí un pequeño guión de envoltura para dd que muestra un buen indicador de porcentaje completado, y trata de no interferir con el proceso o modo de funcionamiento de dd de ninguna manera. Puedes encontrarlo en github:

enlace

Desafortunadamente, este truco SIGUSR1 solo funciona con GNU dd (del paquete coreutils) o con el modo 'dd' de busybox con esa característica específica habilitada en tiempo de compilación. No funciona con el stock 'dd' incluido con la mayoría de los sistemas BSD, incluidos FreeBSD y OS X ...: (

    
respondido por el delt 10.09.2015 - 08:29
1

Este obliga a dd a proporcionar estadísticas cada 2 segundos, lo que es predeterminado para ver:

watch killall -USR1 dd

Para cambiar de cada 2 segundos a cada 5 segundos, agregue la opción -n 5 como esta:

watch -n 5 killall -USR1 dd
    
respondido por el Kostyantyn 30.01.2018 - 21:24
1

Use la opción status=progress para obtener el progreso durante la transferencia.

Además, conv=fsync mostrará errores de E / S.

Ejemplo:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
    
respondido por el MUY Belgium 25.05.2018 - 13:38
0

Puedes ver el progreso de cualquier programa de coreutils usando progress - Coreutils Progress Viewer .

Puede monitorear:

cp mv dd alquitrán rsync grep fgrep egrep corte ordenar md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unzzma 7z 7za zcat bzcat lzcat split gpg

Puede ver la página de manual

Puede usarlo en una ventana de terminal separada mientras el comando se está ejecutando o ejecutarlo con el comando dd:

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

Aquí & convierte el primer comando y continúa de inmediato en lugar de esperar hasta que finalice el comando.

El comando de progreso se inicia con: -m por lo que espera hasta que finalice el proceso supervisado, -p para que monitoree un pid dado y $! es el último comando pid.

Si emite dd con sudo, también debe hacerlo con el progreso:

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
    
respondido por el labsin 22.07.2018 - 22:06

Lea otras preguntas en las etiquetas