Im zweiten Beispiel werden die Stapeldaten über die Standardeingabe gelesen, sodass die Stapeldatei nicht zuerst auf die entfernte Maschine kopiert werden muss. In diesem Beispiel wird das Skript foo.sh vermieden, da eine geänderte Option --read-batch verwendet werden musste. Sie können die Skriptdatei jedoch bearbeiten, wenn Sie sie verwenden möchten (stellen Sie nur sicher, dass keine andere Option versucht, Standard zu verwenden Eingabe, z. B. die Option "--exclude-from = -".
Vorsichtsmaßnahmen:
Die Option "Stapel lesen" erwartet, dass die zu aktualisierende Zielstruktur mit der Zielstruktur identisch ist, die zum Erstellen der Dateigruppe für die Stapelaktualisierung verwendet wurde. Wenn ein Unterschied zwischen den Zielbäumen festgestellt wird, wird das Update möglicherweise mit einer Warnung verworfen (wenn die Datei bereits auf dem neuesten Stand zu sein scheint), oder es wird versucht, die Datei zu aktualisieren, und wenn die Datei nicht überprüft werden kann Wurde das Update mit einem Fehler verworfen. Dies bedeutet, dass es sicher sein sollte, einen Lesebatch-Vorgang erneut auszuführen, wenn der Befehl unterbrochen wurde. Wenn Sie die stapelweise Aktualisierung erzwingen möchten, unabhängig von der Größe und dem Datum der Datei, verwenden Sie die Option -I (beim Lesen des Stapels). Wenn ein Fehler auftritt, befindet sich der Zielbaum wahrscheinlich in einem teilweise aktualisierten Zustand. In diesem Fall,
Die auf allen Zielen verwendete rsync-Version muss mindestens so neu sein wie die, die zum Generieren der Batch-Datei verwendet wurde. Rsync stirbt mit einem Fehler, wenn die Protokollversion in der Batch-Datei zu neu ist, als dass der Batch-Lesevorgang von Rsync verarbeitet werden könnte. Siehe auch die Option --protocol, um zu erfahren, wie das Erstellen von rsync eine Batch-Datei generiert, die ein älterer rsync verstehen kann. (Beachten Sie, dass das Format von Batch-Dateien in Version 2.6.3 geändert wurde, sodass das Mischen älterer Versionen mit neueren Versionen nicht funktioniert.)
Wenn Sie eine Stapeldatei lesen, erzwingt rsync, dass der Wert bestimmter Optionen mit den Daten in der Stapeldatei übereinstimmt, wenn Sie nicht den gleichen Wert wie beim Befehl zum Schreiben im Stapel festgelegt haben. Andere Optionen können (und sollten) geändert werden. Beispielsweise wird "--write-batch" in "--read-batch" geändert, "--files-from" wird gelöscht, und die Optionen "--filter / - include / - exclude" werden nur benötigt, wenn eine der Optionen "--delete" angegeben ist .
Der Code, der die Datei BATCH.sh erstellt, wandelt alle Filter- / Einschluss- / Ausschlussoptionen in eine einzelne Liste um, die als "hier" -Dokument an die Shell-Skriptdatei angehängt wird. Ein fortgeschrittener Benutzer kann dies verwenden, um die Ausschlussliste zu ändern, wenn eine Änderung dessen gewünscht wird, was von --delete gelöscht wird. Ein normaler Benutzer kann dieses Detail ignorieren und einfach das Shell-Skript verwenden, um den entsprechenden Befehl --read-batch für die gestapelten Daten auszuführen.
Der ursprüngliche Batch-Modus in rsync basierte auf "rsync +", die neueste Version verwendet jedoch eine neue Implementierung.
remote destination is not allowed with --read-batch
-
Ein Dateiname bedeutet, aus der Standardeingabe zu lesen, und STDIN wirdfoo
im Beispiel auch aus einer lokalen Datei gelesen .Sie könnten versuchen, unisono zu verwenden . Das Erstellen der Dateiliste sollte wesentlich schneller gehen, da ein Cache der Dateien gespeichert wird.
quelle
Das
rsync
--batch-mode
unterstützt Multicast. Wenn dies in Ihrem Netzwerk möglich ist, lohnt es sich möglicherweise, dies zu prüfen.quelle
Wie wäre es mit einem Dateisystemwechsel?
Vor einiger Zeit habe ich einen Multi-Terabyte-FS von ext3 auf XFS umgestellt. Die Zeit zum Durchsuchen der Verzeichnisse (mit ungefähr 600.000 Dateien, die ich das letzte Mal überprüft habe) ging von 15 bis 17 Minuten auf weniger als 30 Sekunden!
quelle
Keine direkte Antwort, aber wenn Sie rsync Version 3+ verwenden, beginnt die Übertragung, bevor die gesamte Dateiliste generiert wird.
Eine andere Option, die immer noch nicht sehr effizient ist, besteht darin, sie als Jobs auszuführen, sodass einige gleichzeitig ausgeführt werden.
Außerdem habe ich gerade an diese Seltsamkeit gedacht, wenn es Ihnen nichts ausmacht, Teer zu verwenden:
Wobei jeder localhost natürlich andere Server sein würde (setzt eine schlüsselbasierte Anmeldung voraus). Ich habe das oben genannte allerdings noch nie benutzt.
quelle
Wie wäre es, wenn Sie die rsync-Jobs von Host1, Host2 und Host3 ausführen würden? Oder führen Sie einen Job zum Kopieren auf Host1 aus und führen Sie ihn dann auf Host2 und Host3 aus, um ihn von Host1 abzurufen.
quelle
Eine bessere Lösung wäre, ein Repository mit git zu erstellen und nur auf die 3 Hosts zu pushen. Schneller würden Sie den Dateilistenteil nicht benötigen und es verbraucht weniger Ressourcen.
Viel Glück,
João Miguel Neves
quelle
.git/
obwohl Push-Vorgänge zu den Fernbedienungen, die bereits die meisten Daten hätten, schneller wären. git ist kein Ersatz für rsync.http
,nfs
undafp
. GitHub ist eine Website, die sich um die Erstellung und Pflege von Git-Repos kümmert und diese öffentlich macht (sofern Sie nicht bezahlen).Wenn Sie selbst nach dieser Antwort suchen, müssen Sie wahrscheinlich zuerst mit rsync einen Stapel erstellen und ihn dann an alle senden. Dann müsste die Dateiliste nur einmal erstellt werden, und dann könnten Sie es einfach tun Hintergrund alle drei rsyncs, um sie parallel auszuführen.
quelle
Eine andere mögliche Lösung besteht darin, so viele rsync-Prozesse parallel auszuführen, wie Hosts vorhanden sind, z. B. fork.
quelle