Frage Optionen (--partial, --partial-dir) in rsync funktionieren nicht so, wie ich es erwarten würde


Ich habe versucht herauszufinden, wie partielle Transfers wieder aufgenommen werden können rsync (unter Windows mit Cygwin) ohne die --inplace Möglichkeit.

Ich sehe, dass rsync "partielle" Dateien im Zielverzeichnis mit Namen wie erstellt . [Dateiname] .2dxZ1aund so, in meinem Verständnis, wenn ich das benutzte --partial Option, rsync würde eine Datei wie diese sehen und die Übertragung in diese Datei fortsetzen. Aber ich finde das, wenn ich das benutze --partial Option und der rsync-Prozess endet, und wenn ich den rsync-Befehl erneut starte, löscht er diese Teildateien. Vielleicht funktioniert diese Option bei einer kurzen Übertragungsunterbrechung, aber nicht, wenn der Prozess endet und von vorne beginnt.

Zusätzlich zu dieser Option mochte ich die --partial-dir Option, erwartet, dass wenn ich spezifiziere --partial-dir=".rsync" (mit oder ohne die umgebenden Anführungszeichen) würde rsync das Verzeichnis erstellen .rsync im Zielverzeichnis und übertrage die Dateien nach [dir] / .rsync, sie zu bewegen [dir] sobald die Übertragung beendet ist (und Löschen [dir] / .rsync sobald es nicht mehr gebraucht wurde). Aber es scheint, als würde rsync diese Option komplett ignorieren und nur seine temporären Dateien im Zielverzeichnis wie gewohnt erstellen (und sie beim Neustart löschen).

Ich frage mich also: tue ich etwas falsch oder verstehe ich diese Optionen nicht richtig?

Mein Befehl ist: rsync -rt --log-file="rsync.log" --partial-dir=".rsync" --del rsync://rsync-server:port/module/ /cygdrive/local/path/


6
2017-08-20 19:35


Ursprung




Antworten:


Ich habe diesen Befehl vom Windows Taskplaner aus gestartet. Wenn ich den Befehl übernahm und ihn von einer Konsole aus (Eingabeaufforderung) ausführte, funktionierten die Optionen wie erwartet *.

Der einzige Unterschied zwischen der Ausführung der Befehle ergab sich, als ich versuchte, sie zu beenden. Drücken Sie in der Konsole Ctrl+C, rsync endete mit dem Fehler

rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at ...

Klicken Sie im Windows Taskplaner mit der rechten Maustaste auf den ausgeführten Task und wählen Sie Ende führte zum Fehler

rsync: read error: Connection reset by peer (104)

Ich kann also nur annehmen, dass die Art und Weise, wie der Windows Task Scheduler einen Prozess beendet, sich von der Art unterscheidet, wie rsync das Ende von * erwartet, und das macht Rsync zu Ende, ohne dass er seine Routinen ausführt.


* - Ich habe mehr über den Weg erfahren --partial und --partial-dir Arbeit.

Mit --partial, rsync erstellt eine temporäre Datei wie ich gesehen habe, aber wenn rsync (in einer erwarteten Weise) endet, benennt sie diese temporäre Datei in den regulären Dateinamen um (z. B. umbenennen) . [Dateiname] .2dxZ1a zu [Dateiname]) und erstellt dann beim nächsten Durchlauf eine Kopie der Teildatei in eine neue temporäre Datei (z. B. Kopien) [Dateiname] zu . [Dateiname] .34cae2).

Mit --partial-dir, rsync füllt die temporäre Datei und dann beim Schließen die temporäre Datei in das Verzeichnis, das Sie als regulären Dateinamen angeben (z. B. umbenennen) . [Dateiname] .2dxZ1a zu [Teilverzeichnis] ​​/ [Dateiname]). Beim nächsten Durchlauf kopiert es dann die Datei aus [Teilweiser] in eine neue temporäre Datei im Zielverzeichnis.


7
2017-08-27 22:51



Ich denke, Thomas hatte einige wirklich hilfreiche Dinge zu sagen, aber das beantwortete meine Frage. Also, bevor Sie meine Antwort upvote, upvote Thomas! - palswim


Scheint, als hättest du die richtigen Ideen, aber ohne deinen ganzen Befehl zu kennen, ist es unmöglich zu sagen. Für mich funktionieren diese Optionen wie erwartet, wenn ich rsync (mit ctrl-C) kille und es neu starte (GNU / Linux mit rsync 3.0.6). Eine Sache zu behalten ist, dass, wenn Sie --wholefile oder irgendeine Option verwenden, die --folefile impliziert (sehen Sie die rsync man Seite), dann --partial (-dir) wird nicht arbeiten und Sie können die Symptome sehen, die Sie beschreiben. Wenn es das Verzeichnis, das in --partial-dir angegeben ist, nicht finden oder erstellen kann, ignoriert es es automatisch. Eine andere Möglichkeit ist, dass --partial tatsächlich für Sie arbeitet, aber Sie können nicht sagen und denken, dass es von vorn beginnt, obwohl es nicht - ich würde erwarten, dass es die temporären Dateien löscht, sobald es die Übertragung abgeschlossen und die aktuelle Datei aktualisiert hat . Sie können dies mit --progress überwachen - es beginnt bei 0%, springt dann aber sehr schnell zu dem Prozentsatz, der bereits übertragen wurde, und fährt von dort fort. Bei kleineren Dateien kann der Fortschritt zu schnell sein, um viel zu sehen. Versuchen Sie es mit etwas Größerem (100 MB oder mehr, abhängig von der Verbindungsgeschwindigkeit zum Ziel). Hoffe das hilft. Edit: Ich habe festgestellt, dass --partial-dir scheint, während der Übertragung eine temporäre Datei im Zielverzeichnis zu erstellen, genau wie bei --partial. Nur wenn die Übertragung abbricht, wird sie in das von Ihnen angegebene Teildateiverzeichnis verschoben, so dass es zunächst nicht anders aussieht als --partial.


2
2017-08-23 18:57



ich weiß das --partial funktioniert nicht, weil ich die Protokollierungsoption verwende, und nach dem Beenden von rsync und dem Neustart des Prozesses ist immer eine der ersten Zeilen 2010/08/01 01:00:00 [4336] *deleting .[filename].444444 - palswim
Meine beste Vermutung an dieser Stelle ist, dass Sie die Option --wholefile (implizit?) Auslösen. Wenn rsync einfach --partial ignoriert, hätte es keinen Grund, die temporäre Datei zu löschen ... Da dies auf Ihrem System / mit Ihrem spezifischen Befehl ein Problem und kein allgemeines Problem ist, könnte es sich lohnen, einige Tests durchzuführen mit einem minimalen Befehl (keine anderen Optionen) und vielleicht anderen (neueren) Versionen von rsync. Sie könnten versuchen, Rsync von einer Linux Live CD und sehen, ob Sie das gleiche bekommen ... Verwenden Sie einen Rsync-Daemon auf dem Ziel? Wenn ja, muss es auch alle Optionen erkennen. - Thomas