TL; DR: Verwendung --timeout=X
(X in Sekunden), die Standard-Timeout rsync Server zu ändern, nicht --inplace
.
Das Problem ist die Rsync-Server-Prozesse (von denen gibt es zwei, siehe rsync --server ...
in ps
Ausgabe auf dem Empfänger) weiter ausgeführt, um auf den Rsync-Client Daten senden zu warten.
Wenn die Rsync-Server-Prozesse Daten für eine ausreichende Zeit nicht erhalten, werden sie in der Tat Timeout, Selbst-beenden und Bereinigung durch Verschieben der temporären Datei auf seinen "richtigen" Namen (z. B. kein temporäres Suffix). Sie können dann fortfahren.
Wenn Sie nicht auf das lange Standard-Zeitlimit warten möchten, damit der rsync-Server sich selbst beendet, melden Sie sich bei Ihrer Internetverbindung beim Server an und bereinigen Sie die rsync-Serverprozesse manuell. Sie haben jedoch must politely terminate rsync - andernfalls wird die Teildatei nicht an Ort und Stelle verschoben; sondern löschen Sie es (und somit gibt es keine Datei zum Fortsetzen). Um rsync höflich zu bitten, zu beenden, tun Sie nicht SIGKILL
(z. B.), aber SIGTERM
(z. B. pkill -TERM -x rsync
- nur ein Beispiel, sollten Sie darauf achten, nur die Rsync-Prozesse mit Ihrem Client entsprechen).
Zum Glück gibt es einen einfacheren Weg: Verwenden Sie die Option --timeout=X
(X in Sekunden); Es wird auch an die rsync-Serverprozesse übergeben.
Wenn Sie beispielsweise rsync ... --timeout=15 ...
angeben, werden die Client- und Server-rsync-Prozesse sauber beendet, wenn sie innerhalb von 15 Sekunden keine Daten senden/empfangen. Auf dem Server bedeutet dies das Verschieben der temporären Datei in die Position, bereit zum Fortsetzen.
Ich bin mir nicht sicher, der Standard-Timeout-Wert der verschiedenen rsync-Prozesse versuchen, Daten zu senden/empfangen, bevor sie sterben (es kann mit Betriebssystem variieren). In meinen Tests laufen die Server-rsync-Prozesse länger als der lokale Client. Bei einer "toten" Netzwerkverbindung endet der Client nach etwa 30 Sekunden mit einer unterbrochenen Pipe (z. B. kein Netzwerk-Socket); Sie könnten experimentieren oder den Quellcode überprüfen. Das heißt, Sie könnten versuchen, die schlechte Internetverbindung für 15-20 Sekunden "herauszufahren".
Wenn Sie die rsync-Prozesse des Servers nicht bereinigen (oder warten, bis sie absterben), aber stattdessen sofort einen anderen rsync-Clientprozess starten, werden zwei weitere Serverprozesse gestartet (für das andere Ende Ihres neuen Clientprozesses). Insbesondere wird der neue rsync-Client nicht wiederverwendet/erneut mit den vorhandenen rsync-Serverprozessen verbinden. Daher haben Sie zwei temporäre Dateien (und vier rsync-Serverprozesse) - allerdings werden nur die neueren, zweiten temporären Dateien mit neuen Daten geschrieben (die Sie von Ihrem neuen rsync-Client-Prozess erhalten haben).
Interessanterweise, wenn Sie dann alle Rsync-Server-Prozesse bereinigen (zum Beispiel stoppen Sie Ihren Client, der die neuen rsync-Server stoppen wird, dann SIGTERM
die älteren rsync-Server scheint es alle Teildateien in zusammenzufügen Also stelle dir eine lang laufende Teilkopie vor, die stirbt (und du denkst, du hättest alle kopierten Daten "verloren"), und ein kurzes, erneut gestartetes rsync (oops!) .. du kannst die Sekunde anhalten Client, SIGTERM
die ersten Server, werden die Daten zusammenführen, und Sie können wieder
schließlich ein paar kurze Bemerkungen:.
- Verwenden Sie nicht
--inplace
, um dies zu umgehen. Sie werden zweifellos andere Probleme als Ergebnis haben, man rsync
für die Details.
- Es ist trivial, aber
-t
in Ihren rsync-Optionen ist redundant, es wird durch -a
angedeutet.
- Ein bereits komprimiertes Disketten-Image, das über rsync ohne Komprimierung gesendet wird, kann zu einer kürzeren Übertragungszeit führen (durch Vermeidung doppelter Komprimierung). Allerdings bin ich mir in beiden Fällen nicht sicher über die Kompressionstechniken. Ich würde es testen.
- Soweit ich das verstehe
--checksum
/-c
, wird es Ihnen in diesem Fall nicht helfen. Es beeinflusst, wie rsync entscheidet, ob eine Datei übertragen soll. Nach einem ersten rsync können Sie jedoch eine Sekunde rsync mit -c
ausführen, um auf Prüfsummen bestehen, um den seltsamen Fall zu verhindern, dass Dateigröße und Modtime auf beiden Seiten gleich sind, aber schlechte Daten geschrieben wurden.
Nur neugierig: Wäre 'SIGINT' (aka'^C') nicht 'politer' als 'SIGTERM'? – JamesTheAwesomeDude
Ich habe nicht getestet, wie das serverseitige rsync SIGINT verarbeitet, daher bin ich mir nicht sicher, ob es die partielle Datei behalten wird - Sie könnten es überprüfen. Beachten Sie, dass dies nicht viel mit 'Strg-c' zu tun hat; Es kommt vor, dass Ihr Terminal 'SIGINT' in den Vordergrundprozess sendet, wenn Sie' Strg-c' drücken, aber das serverseitige rsync hat kein steuerndes Terminal. Sie müssen sich beim Server anmelden und 'kill' verwenden. Das clientseitige rsync sendet keine Nachricht an den Server (zum Beispiel, nachdem der Client "SIGINT" über Ihr Terminal "Ctrl-c" erhalten hat) - könnte jedoch interessant sein. Wie für anthropomorphizing, nicht sicher, was "politer" ist. :-) –
Ich habe gerade versucht, dieses Timeout-Argument 'rsync -av - delete --progress --stats --human-lesbar --checksum --timeout = 60 --partial-dir/tmp/rsync/rsync: // $ remote:// src/'aber dann hat es während der" receiving filelist "-Phase (die in diesem Fall etwa 30 Minuten dauert) eine Zeitüberschreitung erreicht. Wenn man das Timeout auf eine halbe Stunde einstellt, wird der Zweck etwas verschoben. Irgendeine Abhilfe für dieses? –