Ich verwende es, du
um kontinuierlich die Datenmenge zu überwachen, die auf die von mir duplizierten USB-Laufwerke geschrieben wird.
Ich vergleiche die Festplattennutzung von Quell- und Ziellaufwerken und zeige dem Benutzer den Kopierfortschritt an.
Das Problem besteht darin, dass du
gemeldet wird, dass auf dem Ziellaufwerk 100 % Daten vorhanden sind, obwohl ich sehe, dass sich noch viele Daten im Systemcache befinden, die LED des Laufwerks blinkt und die Laufwerke nicht zum Entfernen bereit sind.
Ich führe und nacheinander aus rsync
, um sicherzustellen, dass die Daten wirklich da sind, bevor ich den Benutzer das Ziellaufwerk entfernen lasse. Ich kann den Fortschritt jedoch nicht überwachen. Der Benutzer sieht also 100 % lange, bevor die Laufwerke wirklich synchronisiert sind.sync
umount
sync
Ich würde gerne den „tatsächlichen“ Kopiervorgang überwachen können, denn darauf kommt es an – es hat keinen Sinn, zu sehen, wie eine rsync
1 GB große Datei in 25 Sekunden vollständig kopiert wird, während ich weitere 5 Minuten warten muss, während sync
das Ganze auf das Laufwerk geschrieben wird (ich übertreibe, aber Sie verstehen, was ich meine).
So überwache ich rsync
den Fortschritt in einer Schleife für jedes Laufwerk:
PROGRESS="$(echo "$(du -s "/MEDIA/TARGET" 2>/dev/null | cut -f 1) / $(du -s "/MEDIA/SOURCE" 2>/dev/null | cut -f 1) " | bc -l)"
$PROGRESS
ist eine Gleitkommazahl zwischen 0 und 1, die das Verhältnis zwischen der Nutzung des Quelllaufwerks und der Nutzung des Ziellaufwerks angibt.
Wie kann ich dies ändern, sodass nur Daten berücksichtigt werden, die bereits mit dem Laufwerk synchronisiert sind und nicht nur im Systemcache warten?
Bearbeiten:
Ich habe festgestellt, dass dd
ich Schreibvorgänge ausführen kann, ohne den Systemcache zu verwenden. Ich habe einen Test durchgeführt und tatsächlich werden beim Kopieren einer Datei auf diese Weise du
tatsächliche Werte gemeldet, und meine Fortschrittsanzeigen sind endlich genau:
dd if=/media/SOURCE/file of=/media/TARGET/file bs=4M oflag=direct
Dies verwendet den Lesecache, deaktiviert jedoch den Schreibcache, sodass der Vorgang leichter zu verfolgen ist, ohne dass übermäßige Lesevorgänge ausgeführt werden müssen. Das Problem besteht darin, dass ich die Verzeichnisstruktur manuell neu erstellen muss dd
, um stattdessen zu verwenden rsync
. Ich muss mich nicht um die Dateiattribute oder Änderungsdaten kümmern.
Ich schätze, ich könnte eine Kombination aus verwenden find
, mkdir
und dd
um zuerst den Verzeichnisbaum neu zu erstellen und dann die Dateien einzeln zu kopieren. Ich frage mich, ob dieser Ansatz irgendwelche Nachteile hat.
Antwort1
Der beste Weg, damit umzugehen, ist anscheinend die Verwendung vondirekte DateiausgabeAuf diese Weise du
sind die Messwerte viel genauer.
Leider ist nur dd
das möglich, daher müssen wir zwei Probleme umgehen:
dd
weiß nicht, was mit Verzeichnissen zu tun istdd
kann immer nur eine Datei gleichzeitig kopieren
Definieren wir zunächst die Eingabe- und Ausgabeverzeichnisse:
SOURCE="/media/source-dir"
TARGET="/media/target-dir"
Gehen wir nun cd
zum Quellverzeichnis, um find
relative Verzeichnisse anzuzeigen, die wir leicht bearbeiten können:
cd "$SOURCE"
Duplizieren Sie den Verzeichnisbaum von $SOURCE
nach$TARGET
find . -type d -exec mkdir -p "$TARGET{}" \;
Duplizieren Sie Dateien von $SOURCE
bis $TARGET
unter Auslassung des Schreibcaches (aber unter Verwendung des Lesecaches!)
find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;
Dadurch bleiben Dateiänderungszeitpunkte, Eigentümer und andere Attribute nicht erhalten – aber für mich ist das ok.