Reprendre rsync sur SSH après une connexion interrompue?

45

Je dois transférer de grandes quantités de données (> 80 Go) sur SSH à l'aide de rsync. Tout fonctionne correctement, mais la connexion DSL à partir de laquelle les données de sauvegarde sont envoyées tombera une fois toutes les 24 heures pendant 3 minutes maximum (le changement de fournisseur n'est pas une option).

Comment puis-je:

  1. Redémarrer automatiquement le transfert lorsque la connexion est rétablie?

  2. Assurez-vous qu'il n'y a pas accidentellement deux commandes rsync s'exécutant en même temps?

Sathyajith Bhat
la source
Tu ne peux pas vérifier le code de retour? while ./run_script; do echo "Retrying..."; done; echo "Done."Assurez-vous de run_scriptrevenir 0en cas de succès.
Kerrek SB
Double possible de serverfault.com/q/98745 .
tanius
Quelques informations utiles ici - je veux juste ajouter qu’une façon de contourner le problème de demande répétée de mot de passe est d’utiliser la commande 'sshpass'. Cela doit généralement être installé avec apt-get, etc.
Rachael Saunders

Réponses:

52

Ce qui suit devrait être utile:

#!/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

Lorsque la connexion sera interrompue, rsync se fermera avec un code de sortie différent de zéro. Ce script continue simplement à réexécuter rsync, en le laissant continuer jusqu'à la fin de la synchronisation.

Peter
la source
1
Merci, je suis en train d'essayer ça maintenant ... mais devrais-je dire ceci: if ["$?" = "0"] ne soit pas: if ["$?" == "0"] (opérateur de comparaison)?
1
Non, dans bash "=", c'est l'égalité des chaînes (une des nombreuses choses qui la rendent confuse, je pense!)
Peter
6
== est le pseudo de =: D
bbaja42 le
8
Ah bon à savoir. bash ne cessera jamais de m'étonner / de m'épouvanter :-P
Peter Le
2
En retard à la fête, cependant pour la postérité: A) utilisez simplement: if rsync -avz --partial source dest; alors ... B) si vous souhaitez comparer les valeurs intégrales si vous utilisez une double parenthèse pour le développement arithmétique: if (($? = 0)) then;
user18402
7

Cela ressemble beaucoup à la réponse de Peter, mais donne à l'utilisateur la possibilité de choisir le fichier distant qu'il souhaite et l'emplacement où il veut l'enregistrer (ainsi que d'effectuer la synchronisation rsync sur ssh). Remplacez USER et HOST par votre nom d'utilisateur et votre hôte, respectivement.

#! / bin / bash
echo -e "Veuillez saisir le chemin d'accès complet au fichier (échappé):"
read -r chemin
echo "chemin: $ chemin"
echo -e "Entrez la destination:"
lire -r dst
echo "Destination: $ dst"
tandis que [1]
faire
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ path" $ dst
    si ["$?" = "0"]; ensuite
        echo "rsync terminé normalement"
        sortie
    autre
        echo "échec de rsync. Nouvelle tentative dans une minute ..."
        dormir 60
    Fi
terminé

Les options rsync utilisées ici activent les statistiques de progression pendant le transfert, l'enregistrement de fichiers partiels en cas d'échec imprévu et la possibilité d'ajouter des fichiers partiellement terminés à la reprise. L'option -v augmente la verbosité, l'option -z permet la compression (bon pour une connexion lente, mais requiert plus de puissance de l'unité centrale aux deux extrémités) et l'option -e nous permet d'effectuer ce transfert sur ssh (le cryptage est toujours bon).

Remarque: Utilisez cette option uniquement si la connexion par clé publique est activée avec votre ssh. Sinon, il vous demandera un mot de passe lors du redémarrage (ce qui supprime toutes les fonctionnalités du script).

KernelSanders
la source
1
C'est la meilleure réponse à la question initiale. Cela s'applique également aux doublons avec la mauvaise réponse sur: serverfault.com/questions/98745/…
rickfoosusa
5

superviseur démon (un gestionnaire de contrôle de processus) pourrait très bien fonctionner après la création de certificats rsa des deux côtés, avec une configuration similaire, comme suit: (/ etc / supervisor / supervisord.conf est le chemin du fichier de configuration sur les systèmes Debian)

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

La réponse de @ Peter semble être très utile, mais pour moi, il était important d'utiliser l' --updateoption. Après la reprise de la connexion, sans que --updatersync ait essayé de tout synchroniser depuis le tout début. Avec --update, les fichiers existants sont ignorés.

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

YasiuMaster
la source
2
--updateignore les fichiers qui existent déjà ... Y compris ceux qui n'ont pas été complètement copiés dans la cible. Je pense que cela va à l'encontre de la plupart des cas d'utilisation.
durum
@durum ce n'est pas vrai au moins sur rsync 3.1.2. après un transfert interrompu, je vois que cela fonctionne correctement sur le même fichier. J'ai utilisé rsync sur ssh, la commande était rsync --partial --update file1 remotehost:file1. après avoir transféré 15%, j'ai cassé le transfert (kill-KILL).
Filiprem