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).
pv
pode 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.dd
escreve 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 quepv
, 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. Issodd
também terminará muito antes de os buffers serem liberados.Posso 'cronometrar' o processo de gravação inclusive
sync
com otime
comandotime ( 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
iotop
para 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'