Lo hice y lo entendí

El blog de Vicente Navarro
10 dic

Obtener estadísticas de dd mientras se está ejecutando

En la anterior entrada, Usando ntfsclone y dd para clonado por red con netcat, decía algo que no es cierto:

Sin embargo, mientras que la salida del ntfsclone nos dice qué porcentaje de la imagen lleva leído o escrito, el dd no dice absolutamente nada hasta que finaliza. Como clonar un disco de muchos Gigabytes puede ser una tarea bastante larga, puede ser muy útil introducir entre los comandos de la tubería un pv para saber por dónde va la copia.

Sor Zitroën (¡gracias!) ha sido tan amable de indicarme que sí que hay una forma de obtener estadísticas del trabajo que lleva hecho dd, y que está hasta documentado en la página de man de dd:

Sending a USR1 signal to a running `dd' process makes it print I/O statistics to  standard
error and then resume copying.
 
       $ dd if=/dev/zero of=/dev/null& pid=$!
       $ kill -USR1 $pid; sleep 1; kill $pid
 
       18335302+0  records  in  18335302+0  records  out 9387674624 bytes (9.4 GB) copied,
       34.6279 seconds, 271 MB/s

Podría haber añadido esta nota como corrección a la anterior entrada, pero me ha gustado tanto, es una funcionalidad tan interesante y hasta ahora desconocida para mí, que he pensado que tiene entidad propia para comentarlo de forma separada.

Así, si estamos haciendo clonando un disco a través de la red, como veíamos previamente:

sisdest $ sudo nc -lp 2222 | dd of=/dev/hda

sisorig $ sudo dd if=/dev/hda | nc -q 0 sisdest 2222

En otro terminal (en cada una de las máquinas) podemos hacer un “ps -ef | grep dd” para buscar el PID del proceso y luego, al hacer el kill, en el terminal donde habíamos lanzado el dd, encontraremos, en la salida de error, las estadísticas del trabajo hecho hasta el momento por dd:

sisdest # ps -ef | grep dd
root     23772 23745  5 19:24 pts/1    00:00:01 dd of /dev/hda
sisorig # kill -USR1 23772
sisorig # kill -USR1 23772

sisorig # ps -ef | grep dd
root     34675 24619 28 11:23 pts/1    00:00:05 dd if /dev/hda
sisdest # kill -USR1 34675
sisdest # kill -USR1 34675

sisdest # nc -lp 2222 | dd of=/dev/hda
340522+0 records in
340522+0 records out
174347264 bytes (174 MB) copied, 21.9449 seconds, 7.9 MB/s
363920+0 records in
363920+0 records out
186327040 bytes (186 MB) copied, 23.4599 seconds, 7.9 MB/s

sisorig # dd if=/dev/hda | nc -q 0 sisdest 2222
242172+0 records in
242172+0 records out
123992064 bytes (124 MB) copied, 17.1812 seconds, 7.2 MB/s
270881+0 records in
270881+0 records out
138691072 bytes (139 MB) copied, 19.0057 seconds, 7.3 MB/s

Y una vez más vemos que los sistemas UNIX, día tras día, aún tienen la capacidad de sorprendernos con esas pequeñas funcionalidades medio ocultas que están siempre a la espera de que las descubramos.

:wq

Entradas relacionadas

Tema LHYLE09, creado por Vicente Navarro