Скрипт оболочки

Скрипт оболочки

Прогресс и предполагаемое время написания без и сsync

Я не нашел инструмента (или простого метода), который включал бы очистку буферов при отображении прогресса и оценке предполагаемого времени всего процесса записи, ETA (предполагаемое время прибытия).

  • pvможет показывать время выполнения, как его видит операционная система, но если целевой диск медленный и есть много оперативной памяти, он показывает только время, пока данные не будут записаны в буфер. Это время может быть небольшой частью реального времени, пока буферы не будут очищены.

  • ddпишет окончательный отчет о количестве использованных данных, времени и скорости передачи. Его также можно заставить писать отчеты о ходе выполнения. Раньше он давал гораздо лучшую оценку, чем pv, но в настоящее время USB-накопители и карты памяти все еще очень медленные, в то время как другие процессы быстрые, а доступная память для буферов большая. Поэтому ddтакже завершится задолго до того, как буферы будут очищены.

  • Я могу «засекать» время процесса записи, в том числе syncс помощью timeкоманды

    time ( write command; sync )
    

    и он даст мне реальное использованное время, что полезно, но только после того, как он закончится. Он не показывает прогресс и не оценивает общее оставшееся время.

  • Я могу запустить его iotop, чтобы увидеть процессы чтения и записи, а также то, как быстро все считывается и записывается, но он не оценивает оставшееся время.

Как показать прогресс и предполагаемое время выполнениявесьпроцесс записи?

Как можно отобразить ход выполнения и предполагаемое время всего процесса записи, ETA (предполагаемое время прибытия), включая очистку буферов sync?

Ссылка на связанный вопрос

решение1

Скрипт оболочки

Спасибо @LinuxSecurityFreak за совет использовать объем «грязных» данных, указанных в /proc/meminfo.

Я сделал следующий скрипт оболочки flusher. Он показывает прогресс и предполагаемое время очистки буферов. Его можно использовать, например, после клонирования из файла iso на USB-накопитель или карту памяти, чтобы создать живой диск с операционной системой 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"

Демонстрационные примеры

Клонирование на медленный диск (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

Вывод из flusher:

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

Клонирование на быстрый диск (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

Вывод из flusher:

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

Редактировать:

В текущей версии есть обновленная версия под flusherназваниемwatch-flushmkusb. Его можно использовать отдельно из собственного окна с помощью следующего псевдонима:

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'

Связанный контент