Shell-Skript

Shell-Skript

Fortschritt und geschätzte Schreibzeit ohne und mitsync

Ich habe kein Tool (oder einfache Methode) gefunden, das das Leeren der Puffer beim Anzeigen des Fortschritts und Schätzen der voraussichtlichen Zeit für den gesamten Schreibvorgang, ETA (Estimated Time of Arrival), umfasst.

  • pvkann die Zeit für den Fortschritt anzeigen, wie sie vom Betriebssystem gesehen wird, aber wenn das Ziellaufwerk langsam ist und viel RAM vorhanden ist, wird nur die Zeit angezeigt, bis die Daten in einen Puffer geschrieben werden. Diese Zeit kann ein kleiner Bruchteil der tatsächlichen Zeit sein, die vergeht, bis die Puffer geleert werden.

  • ddschreibt einen Abschlussbericht über die verwendete Datenmenge, die Zeit und die Übertragungsrate. Es kann auch so eingestellt werden, dass „Fortschritts“-Berichte geschrieben werden. Früher lieferte es eine viel bessere Schätzung als pv, aber heutzutage sind die USB-Laufwerke und Speicherkarten immer noch sehr langsam, während die anderen Prozesse schnell sind und der verfügbare Speicher für Puffer groß ist. Daher ddwird es auch lange vor dem Leeren der Puffer fertig sein.

  • Ich kann den Schreibvorgang unter anderem syncmit dem timeBefehl „zeitlich steuern“.

    time ( write command; sync )
    

    und es zeigt mir die tatsächlich verbrauchte Zeit an, was nützlich ist, aber erst, wenn es fertig ist. Es zeigt nicht den Fortschritt an und schätzt nicht die gesamte verbleibende Zeit.

  • Ich kann iotopLese- und Schreibvorgänge anzeigen und angeben, wie schnell Dinge gelesen und geschrieben werden, aber die verbleibende Zeit wird nicht geschätzt.

So zeigen Sie den Fortschritt und die voraussichtliche Zeit für dasganzSchreibvorgang?

Wie kann ich den Fortschritt und die geschätzte Zeit für den gesamten Schreibvorgang, ETA (Estimated Time of Arrival), einschließlich des Leerens der Puffer mit anzeigen sync?

Link zur verwandten Frage

Antwort1

Shell-Skript

Ein großes Lob an @LinuxSecurityFreak für den Rat, die in gemeldete Menge an „schmutzigen“ Daten zu verwenden /proc/meminfo.

Ich habe das folgende Shellscript erstellt flusher. Es zeigt den Fortschritt und die geschätzte Zeit zum Leeren der Puffer. Es kann beispielsweise nach dem Klonen einer ISO-Datei auf ein USB-Laufwerk oder eine Speicherkarte verwendet werden, um ein Live-Laufwerk mit einem Linux-Betriebssystem zu erstellen.

#!/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"

Demobeispiele

Klonen auf ein langsames Laufwerk (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

Ausgabe von flusher:

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

Klonen auf ein schnelles Laufwerk (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

Ausgabe von flusher:

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

Bearbeiten:

Es gibt eine aktualisierte Version von flusher, genannt watch-flush, in der aktuellen Version inAbonnieren. Es kann separat von einem eigenen Fenster aus über den folgenden Alias ​​verwendet werden,

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'

verwandte Informationen