So rufen Sie rsync wiederholt auf, bis die Dateien erfolgreich übertragen wurden

27

Ich versuche, Dateien von einem Remoteserver zu synchronisieren, der nicht zuverlässig ist, was bedeutet, dass die Verbindung "zufällig" fehlschlägt

rsync: Verbindung unerwartet geschlossen

Rsync wird mit --partial aufgerufen, daher möchte ich rsync in einer Schleife aufrufen können, bis die Dateien vollständig übertragen wurden. Es scheint kein Flag zu geben, das rsync anweist, es erneut zu versuchen.

Was wäre der beste Weg, um es zu schreiben? Eine Bash for Loop?

Bruno Lopes
quelle
1
Die folgenden Antworten sind zwar hilfreich, aber es ist möglicherweise besser, herauszufinden, warum dies fehlschlägt, und sie zum Stillstand zu bringen. Ich gehe davon aus, dass Sie den Server, den Client und das Netzwerk dazwischen steuern, sodass Sie tcpdump an verschiedenen Stellen ausführen können, um zu sehen, wie es geschlossen wurde. Möglicherweise trennt eines Ihrer Firewall- oder VPN-Geräte die Verbindung?
MarkR
Der Server, mit dem die Verbindung hergestellt wird, ist ein freigegebener Host, sodass ich keinen Root-Zugriff darauf habe. Ich werde vielleicht untersuchen, warum es geschlossen wird, aber ich bin mehr als froh, dass ich es noch einmal versuchen kann. Trotzdem vielen Dank für das Heads-up
Bruno Lopes
Ich war schockiert, als ich feststellte, dass rsync nicht die Möglichkeit hatte, es erneut zu versuchen!
Michael
rsync --partial --append hat die Möglichkeit, den Rückgabecode manuell oder in einem Skript zu wiederholen. Duplizieren von: superuser.com/questions/302842/...
rickfoosusa

Antworten:

29

Wenn Sie alles auf einmal synchronisieren, rufen Sie rsync in einer Schleife auf, bis Sie mit rsync einen erfolgreichen Rückkehrcode erhalten.

So etwas wie:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

Dies führt eine Schleife durch, die rsync aufruft, bis der Rückgabewert 0 lautet. Möglicherweise möchten Sie dort einen Sleep hinzufügen, um die DOS-Installation Ihres Servers zu unterbinden.

David
quelle
28
Sie können nur schreiben, während! rsync -a ....; schlafe 5; erledigt
Justin
1
Seien Sie vorsichtig, wie Sie dies verwenden. Wenn Sie beispielsweise versuchen, es über cron auszuführen, können Probleme mit der Parallelität auftreten.
Keiran Holloway,
3
Dies wird zu einer Endlosschleife, wenn ein nicht vorübergehender Fehler auftritt (z. B. ein Berechtigungsfehler beim Lesen oder Schreiben von Dateien). Ich würde empfehlen, den Exit-Status von rsync auf bestimmte Netzwerkfehler zu überprüfen RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](oder den Exit-Status, den Sie bei Netzwerkabbrüchen sehen).
Gordon Davisson
1
Da ich dies nicht (völlig) unbeaufsichtigt ausführe, sind Endlosschleifen und Nebenläufigkeit kein großes Problem, danke.
Bruno Lopes
2
Schade, dass in rsync diese Funktion nicht integriert ist, da jede Art von Shell-basierter Schleife in Fällen, in denen die automatische Authentifizierung nicht verfügbar oder nicht geeignet ist, zur Eingabe eines Kennworts auffordert.
Michael
1

purtting alles zusammen mit sshpass

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
Toolkit
quelle