Shellscript

Shellscript

Progresso e tempo estimado para escrever sem e comsync

Não encontrei nenhuma ferramenta (ou método simples) que inclua a limpeza dos buffers ao mostrar o progresso e estimar o tempo estimado para todo o processo de gravação, ETA (Tempo Estimado de Chegada).

  • pvpode mostrar o tempo para o progresso visto pelo sistema operacional, mas se a unidade de destino for lenta e houver muita RAM, ele mostra apenas o tempo até que os dados sejam gravados em um buffer. Este tempo pode ser uma pequena fração do tempo real até que os buffers sejam liberados.

  • ddescreve um relatório final sobre a quantidade de dados usados, tempo e taxa de transferência. Também pode ser feito escrever relatórios de “progresso”. Costumava dar uma estimativa muito melhor do que pv, mas hoje em dia os drives USB e cartões de memória ainda são muito lentos, enquanto os outros processos são rápidos e a memória disponível para buffers é grande. Isso ddtambém terminará muito antes de os buffers serem liberados.

  • Posso 'cronometrar' o processo de gravação inclusive synccom o timecomando

    time ( write command; sync )
    

    e me dará o tempo real utilizado, o que é útil, mas somente depois de concluído. Não mostra o progresso e não estima o tempo total restante.

  • Posso executar iotoppara mostrar os processos de leitura e gravação e a rapidez com que as coisas são lidas e escritas, mas não estima o tempo restante.

Como mostrar o progresso e o tempo estimado para otodoprocesso de gravação?

Como posso mostrar o progresso e o tempo estimado para todo o processo de gravação, ETA (Estimated Time of Arrival), incluindo a limpeza dos buffers com sync?

Link para pergunta relacionada

Responder1

Shellscript

Parabéns ao @LinuxSecurityFreak pelo conselho para usar a quantidade de dados 'sujos' relatados em /proc/meminfo.

Eu fiz o seguinte shellscript flusher. Ele mostra o progresso e o tempo estimado para liberar os buffers. Ele pode ser usado, por exemplo, após a clonagem de um arquivo iso para uma unidade USB ou cartão de memória para criar uma unidade ativa com um sistema operacional 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"

Exemplos de demonstração

Clonando para uma unidade lenta (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

Saída de flusher:

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

Clonando para uma unidade rápida (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

Saída 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 uma versão atualizada de flusher, chamada watch-flush, na versão atual emmkusb. Ele pode ser usado separadamente de uma janela própria através do seguinte 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'

informação relacionada