Shellscript

Shellscript

Progreso y tiempo estimado para escribir sin y consync

No he encontrado ninguna herramienta (o método sencillo) que incluya vaciar los buffers al mostrar el progreso y estimar el tiempo estimado para todo el proceso de escritura, ETA (hora estimada de llegada).

  • pvpuede mostrar el tiempo del progreso visto por el sistema operativo, pero si la unidad de destino es lenta y hay mucha RAM, solo muestra el tiempo hasta que los datos se escriben en un búfer. Este tiempo puede ser una pequeña fracción del tiempo real hasta que se vacían los buffers.

  • ddEscribe un informe final sobre la cantidad de datos utilizados, el tiempo y la tasa de transferencia. También se puede obligar a escribir informes de "progreso". Solía ​​dar una estimación mucho mejor que pv, pero hoy en día las unidades USB y las tarjetas de memoria siguen siendo muy lentas, mientras que los demás procesos son rápidos y la memoria disponible para los buffers es grande. Por lo tanto, ddtambién terminará mucho antes de que se vacíen los buffers.

  • Puedo 'cronometrar' el proceso de escritura incluso synccon el timecomando

    time ( write command; sync )
    

    y me dará el tiempo real utilizado lo cual es útil, pero sólo después de que haya terminado. No muestra el progreso y no estima el tiempo total restante.

  • Puedo ejecutar iotoppara mostrar los procesos de lectura y escritura y qué tan rápido se leen y escriben las cosas, pero no estima el tiempo restante.

Cómo mostrar el progreso y el tiempo estimado para elenteroproceso de escritura?

¿Cómo puedo mostrar el progreso y el tiempo estimado para todo el proceso de escritura, ETA (hora estimada de llegada), incluido el vaciado de los buffers sync?

Enlace a pregunta relacionada

Respuesta1

Shellscript

Felicitaciones a @LinuxSecurityFreak por el consejo de utilizar la cantidad de datos "sucios" reportados en /proc/meminfo.

Hice el siguiente shellscript flusher. Muestra el progreso y el tiempo estimado para vaciar los buffers. Se puede utilizar, por ejemplo, después de clonar un archivo iso a una unidad USB o tarjeta de memoria para crear una unidad en vivo con un sistema operativo Linux.

#!/bin/bash

timeorig=$(date '+%s')
deltat=5  # checking time interval

dirtorig=$(grep -e 'Dirty:' /proc/meminfo | tr -s ' ' '\t' | cut -f2)
dirt0=$dirtorig
echo -n "dirty = $dirt0 kB - before sync"

sync & spid=$!

while ps -A|grep "$spid" > /dev/null
do
 sleep "$deltat"
 dirty=$(grep -e 'Dirty:' /proc/meminfo | tr -s ' ' '\t' | cut -f2)
 deltad=$((dirt0-dirty))
 if [ $deltad -gt 0 ]
 then
  eta="$((dirty*deltat/deltad)) s"
  rate="$(((deltad+500)/deltat/1000)) MB/s"
 else
  eta="n.a."
  rate="n.a."
 fi
 echo -en "\0033[2K\0033[1G"
 echo -n "dirty = $dirty kB -- syncing -- rate = $rate -- eta = $eta"
 dirt0="$dirty"
done
echo -e "\0033[2K\0033[1GDone syncing :-)"

timefinal=$(date '+%s')
timeused=$((timefinal-timeorig))
if [ $timeused -gt 0 ]
then
 rate="$(((10*dirtorig+5)/timeused/10))"
 if [ $rate -ge 10000 ]
 then
  rate="$(((dirtorig+500)/timeused/1000)) MB/s"
 else
  rate="$rate kB/S"
 fi
else
 rate="n.a."
fi
echo "syncing time = $timeused s -- rate = $rate"

Ejemplos de demostración

Clonación a un disco lento (USB 2)

$ sudo dd if=xubuntu-18.04.1-desktop-amd64.iso of=/dev/sde bs=1M ; ./flusher
[sudo] password for sudodus: 
1367+1 posts in
1367+1 posts ut
1434386432 bytes (1.4 GB, 1.3 GiB) copied, 0.408724 s, 3.5 GB/s

Salida de flusher:

dirty = 840600 kB -- syncing -- rate = 5 MB/s -- eta = 156 s
...
Done syncing :-)
syncing time = 302 s -- rate = 4639 kB/S

Clonación a un disco rápido (eSATA)

$ sudo dd if=xubuntu-18.04.1-desktop-amd64.iso of=/dev/sda bs=1M ; ./flusher
1367+1 posts in
1367+1 posts ut
1434386432 bytes (1.4 GB, 1.3 GiB) copied, 0.404442 s, 3.5 GB/s

Salida de flusher:

dirty = 727508 kB -- syncing -- rate = 59 MB/s -- eta = 12 s
...
Done syncing :-)
syncing time = 25 s -- rate = 56 MB/s

Editar:

Existe una versión actualizada de flusher, llamada watch-flush, en la versión actual enmkusb. Se puede utilizar por separado desde una ventana propia a través del siguiente alias,

alias wf='xterm -title "watch-flush" -fa default -fs 13 -fg yellow -bg "#504030" -geometry 70x7 -e bash -c "watch-flush;read -n1" 2> /dev/null'

información relacionada