Rsync über SSH nach unterbrochener Verbindung fortsetzen?

45

Ich muss mit rsync große Datenmengen (> 80 GB) über ssh übertragen. Alles funktioniert einwandfrei, aber die DSL-Verbindung, von der die Sicherungsdaten gesendet werden, wird bis zu 3 Minuten lang alle 24 Stunden unterbrochen (ein Providerwechsel ist nicht möglich).

Wie mache ich:

  1. Die Übertragung automatisch neu starten, wenn die Verbindung wiederhergestellt ist?

  2. Stellen Sie sicher, dass nicht versehentlich zwei rsync-Befehle gleichzeitig ausgeführt werden.

Sathyajith Bhat
quelle
Können Sie den Rückkehrcode nicht überprüfen? while ./run_script; do echo "Retrying..."; done; echo "Done."Stellen Sie sicher, dass Sie run_scriptwieder 0erfolgreich sind.
Kerrek SB
Mögliches Duplikat von serverfault.com/q/98745 .
Tanius
Einige nützliche Informationen hier - ich möchte nur hinzufügen, dass eine Möglichkeit, das wiederholte Problem der Passwortabfrage zu umgehen, die Verwendung des Befehls 'sshpass' ist. In der Regel auf diese Bedürfnisse mit installiert werden apt-get usw.
Rachael Saunders

Antworten:

52

Folgendes sollte hilfreich sein:

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

Wenn die Verbindung unterbrochen wird, wird rsync mit einem Exit-Code ungleich Null beendet. Dieses Skript führt einfach rsync erneut aus und lässt es so lange weiterlaufen, bis die Synchronisierung normal abgeschlossen ist.

Peter
quelle
1
Danke, ich versuche es jetzt ... aber sollte das: if ["$?" = "0"] nicht sein: wenn ["$?" == "0"] (Vergleichsoperator)?
1
Nein, in der Bash "=" ist die String-Gleichheit (eines der vielen Dinge, die es verwirrend machen, denke ich!)
Peter
6
== ist Alias ​​für =: D
bbaja42
8
Ah, gut zu wissen. Bash wird mich immer wieder in Erstaunen versetzen :-P
Peter
2
Spät zur Party, aber für die Nachwelt: A) benutze einfach: if rsync -avz --partial source dest; dann ... B) wenn Sie Integralwerte vergleichen möchten, wenn Sie doppelte Klammern für die arithmetische Erweiterung verwenden: wenn (($? = 0)) dann;
user18402
7

Dies entspricht in etwa der Antwort von Peter, gibt dem Benutzer jedoch die Option, welche Remote-Datei er speichern und wo er sie speichern möchte (und führt den RSYNC über SSH durch). Ersetzen Sie USER und HOST durch Ihren Benutzernamen bzw. Host.

#! / bin / bash
echo -e "Bitte geben Sie den vollständigen (mit Escape-Zeichen versehenen) Dateipfad ein:"
Lese -r Pfad
echo "Pfad: $ Pfad"
echo -e "Geben Sie das Ziel ein:"
lies -r dst
echo "Ziel: $ dst"
während [1]
machen
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ path" $ dst
    wenn ["$?" = "0"]; dann
        echo "rsync normal beendet"
        Ausfahrt
    sonst
        Echo "Rsync-Fehler. Wiederholung in einer Minute ..."
        Schlaf 60
    fi
getan

Die hier verwendeten rsync-Optionen ermöglichen die Fortschrittsstatistik während der Übertragung, das Speichern von Teildateien bei unerwartetem Fehler und die Möglichkeit, bei Wiederaufnahme an teilweise abgeschlossene Dateien anzuhängen. Die Option -v erhöht die Ausführlichkeit, die Option -z aktiviert die Komprimierung (gut für eine langsame Verbindung, erfordert jedoch mehr CPU-Leistung an beiden Enden) und die Option -e ermöglicht die Übertragung über ssh (Verschlüsselung ist immer gut).

Hinweis: Verwenden Sie diese Option nur, wenn Sie die Anmeldung mit öffentlichem Schlüssel für Ihr ssh aktiviert haben. Andernfalls werden Sie beim Neustart nach einem Kennwort gefragt (wodurch alle Funktionen des Skripts beendet werden).

KernelSanders
quelle
1
Dies ist die beste Antwort auf die ursprüngliche Frage. Es gilt auch für ein Duplikat mit der falschen Antwort unter: serverfault.com/questions/98745/…
rickfoosusa
5

Der Supervisor-Daemon (ein Prozesssteuerungsmanager) könnte sehr gut funktionieren, nachdem er RSA-Zertifikate beider Seiten mit einer ähnlichen Konfiguration wie folgt erstellt hat: (/ etc / supervisor / supervisord.conf ist der Konfigurationsdateipfad auf Debian-basierten Systemen.)

[program:rsync-remoteserver]
command=rsync -avz --progress [email protected]:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath
ugurarpaci
quelle
1

Die Antwort von @Peter scheint sehr nützlich zu sein, aber für mich war es wichtig, die --updateOption zu verwenden . Nachdem die Verbindung wieder aufgenommen --updatewurde, versuchte rsync von Anfang an, alle zu synchronisieren. Mit --updatewerden bereits vorhandene Dateien übersprungen.

rsync --partial --update --progress -r [SOURCE] [DESTINATION]

YasiuMaster
quelle
2
--updateÜberspringt bereits vorhandene Dateien. Einschließlich der Dateien, die nicht vollständig auf das Ziel kopiert wurden. Ich denke, dass es gegen die meisten Anwendungsfälle geht.
Durum
@durum es stimmt zumindest nicht auf rsync 3.1.2. nach unterbrochener übertragung sehe ich es funktioniert einwandfrei auf der gleichen datei. Ich habe rsync über ssh verwendet, der Befehl war rsync --partial --update file1 remotehost:file1. nachdem ich 15% transferiert hatte, habe ich den Transfer abgebrochen (kill-Kill).
Filiprem