2013-05-15 15 views
18

Ich versuche, meinen Dateiserver auf einen Remove-Dateiserver mit Rsync zu sichern. Rsync wird nicht erfolgreich fortgesetzt, wenn eine Übertragung unterbrochen wird. Ich habe die partielle Option verwendet, aber rsync findet die Datei, die sie bereits gestartet hat, nicht, weil sie sie in eine temporäre Datei umbenennt, und wenn sie fortgesetzt wird, erstellt sie eine neue Datei und beginnt von vorne.Wiederaufnahme von rsync teilweise (-P/- teilweise) auf einer unterbrochenen Übertragung

Hier ist mein Befehl:

rsync -avztP -e "ssh -p 2222" /volume1/ [email protected]:/home/myaccount/backup/ --exclude "@spool" --exclude "@tmp"

Wenn dieser Befehl ausgeführt ist, eine Sicherungsdatei OldDisk.dmg von meiner lokalen Maschine mit dem Namen auf dem entfernten Rechner als so etwas wie .OldDisk erstellt bekommen. dmg.SjDndj23.

Nun, wenn die Internetverbindung unterbrochen wird, und ich habe die Übertragung fortzusetzen, muss ich finden, wo rsync, indem du die temporäre Datei wie .OldDisk.dmg.SjDndj23 aus links und benennen Sie sie in OldDisk.dmg Damit es dort bereits existiert gibt es eine Datei, die es wieder aufnehmen kann.

Wie kann ich das beheben, damit ich nicht jedes Mal manuell eingreifen muss?

Antwort

24

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.
+1

Nur neugierig: Wäre 'SIGINT' (aka'^C') nicht 'politer' als 'SIGTERM'? – JamesTheAwesomeDude

+0

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. :-) –

+0

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? –

2

Ich fand, dass das Hinzufügen --inplace es behebt. Ich bin mir nicht sicher, wie - partial ohne es funktionieren soll, aber es hat meine Übertragungen wieder aufgenommen. Meine Dateien sind jedoch immer noch ziemlich groß und ich frage mich, ob ich am Ende beschädigte Dateien bekomme, wenn eine Übertragung beginnt und Stunden später eine andere Übertragung beginnt, aber eine unvollständige Datei sieht und nicht weiß, dass sie gerade hochgeladen wird es. Weiß jemand? Vielleicht etwas Bash-Scripting, um die aktuelle Prozess-ID zu protokollieren und keine weitere Übertragung zu starten?

+0

Seien Sie vorsichtig mit Inplace wie es auch mehr schaden als nützen können. Es ist bekannt, dass es weitere Inkonsistenzen verursacht, wenn gerade auf eine Datei von anderen zugegriffen wird. – fyrye

+2

['--append-verify' impliziert '--inplace'] (https://download.samba.org/pub/rsync/rsync.html), überspringt aber Inhalte, die nicht angehängt werden müssen. –

0

Wenn Sie nach einem Lebenslauf Angst vor beschädigten Dateien haben, könnten Sie --checksum hinzufügen, um es zu zwingen, die gesamte Datei jedes Mal zu überprüfen. In der Tat wird es einige Disk-IO- und CPU-Zyklen kosten, aber nur einen geringen Netzwerk-Overhead.

+0

Mein Verständnis von 'Mann rsync' ist Prüfsummen steuern rsync die Bestimmung, was zu übertragen, nicht eine Post-Transfer-Validierung, wenn das, was Sie vorschlagen? Ich kann nicht sehen, wie Dateigröße und Modtime gleich sein werden (also eine Prüfsumme benötigen), wenn '--inplace' verwendet wird und eine Verbindung getrennt wird. Um die Korrektheit der Daten zu gewährleisten, müsste das OP ein zweites rsync mit '-c' ausführen. –

5

Sorry aber die anderen Antworten hier sind zu kompliziert: -7. Eine einfachere Antwort für mich arbeiten: (mit rsync über -e ssh)

# optionally move rsync temp file, then resume using rsync 
dst$ mv .<filename>.6FuChr <filename> 
src$ rsync -avhzP --bwlimit=1000 -e ssh <fromfiles> <[email protected]>:<destdir>/ 

funktioniert auch, wenn von einem scp wieder aufzunehmen, die unterbrochen wurde.

Rsync erstellt eine temporäre Datei ... Die temporäre Datei wächst schnell auf die Größe der teilweise übertragenen Datei. Die Übertragung wird fortgesetzt.

Scp schreibt in die tatsächliche Endzieldatei. Wenn die Übertragung unterbrochen wird, handelt es sich um eine abgeschnittene Datei.

Explaination von argumente:

-avhz .. h = humanoid, v = verbose, a = Archiv, z = Kompression .. Archiv weist es time_t Werte also, selbst wenn die Uhren sind aus rsync weiß das zu halten Echtheitsdatum jeder Datei

-P steht für --partial --progress. --partial teilweise rsync zu halten erzählt übertragene Dateien (und auf Lebenslauf wird verwenden rsync teilweise Dateien immer übertragen, nachdem sicher Prüfsummen)

Von Manpages: http://ss64.com/bash/rsync_options.html

--partial 
By default, rsync will delete any partially transferred file if the transfer 
is interrupted. In some circumstances it is more desirable to keep partially 
transferred files. Using the --partial option tells rsync to keep the partial 
file which should make a subsequent transfer of the rest of the file much faster. 

--progress 
This option tells rsync to print information showing the progress of the transfer. 
This gives a bored user something to watch. 
This option is normally combined with -v. Using this option without the -v option 
will produce weird results on your display. 

-P 
The -P option is equivalent to --partial --progress. 
I found myself typing that combination quite often so I created an option to make 
it easier. 

HINWEIS: für eine Verbindung, die ist mehrfach unterbrochen: Wenn Sie nach rsync (nach dem Abbruch der Verbindung) fortsetzen müssen, ist es am besten, die temporäre Datei am Ziel umzubenennen. scp erstellt eine Datei mit dem gleichen Namen wie die endgültige Datei. Wenn scp unterbrochen wird, ist diese Datei eine abgeschnittene Version der Datei. Ein rsync (-avzhP) wird von dieser Datei fortgesetzt, beginnt jedoch mit dem Schreiben in einen temporären Dateinamen wie YYG7AL.

Vorgehen bei der mit scp Start:

scp; *interrupt*; rsync; [REPEAT_as_needed: *interrupt*; mv .destfile.tmpzhX destfile; rsync;]. 

Vorgehen bei der mit rsync Start:

rsync; [REPEAT_as_needed: *interrupt*; mv .destfile.tmpzhX destfile; rsync;]. 
+0

Aber [diese Seite] (http://explainshell.com/explain?cmd=rsync+--timeout%3D60+--archive+--partial+--append-verify+--progress+--stats+user%40host%3A%2Ffolder+ % 2Fcygdrive% 2Ff% 2Fbackup) sagt '--progress' impliziert' --verbose'. –

+0

'--partial' behält partielle Dateien, aber um von diesen fortzufahren, sollte man '--append' oder' --append-verify' verwenden und das Ziel sollte kleiner als die Quelle sein, [obwohl die Quelle eine neuere hat Zeitstempel.] (http://unix.stackexchange.com/questions/48298/can-rsync-resume-after-being-interrupted/165417?noredirect=1#comment405796_165417) –

+0

Wenn Sie erneut fortsetzen müssen (die rsync Verbindung unterbrochen ist) dann am besten die temporäre Datei am Ziel umbenennen. Also Prozedur beim Starten mit scp: scp * interrupt * rsync [REPEAT_als_needed: * interrupt * mv_desttmp_destfile rsync]. Vorgehensweise beim Starten mit rsync: rsync [REPEAT_as_needed: * interrupt * mv_desttmp_destfile rsync]. – gaoithe