55 votes

Reprendre rsync sur SSH après une rupture de connexion ?

Je dois transférer de grandes quantités de données (>80 GB) via ssh en utilisant rsync. Tout fonctionne bien, mais la connexion DSL à partir de laquelle les données de sauvegarde sont envoyées tombe en panne une fois toutes les 24 heures pendant 3 minutes (il n'est pas possible de changer de fournisseur d'accès).

Comment faire ?

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

  2. Assurez-vous qu'il n'y a pas par accident deux commandes rsync en cours d'exécution en même temps ?

62voto

Peter Points 711

Les éléments suivants devraient être utiles :

#!/bin/bash

while [ 1 ]
do
    rsync -avz --timeout=60 --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 est interrompue, rsync s'arrête avec un code de sortie non nul. Ce script continue simplement à relancer rsync, le laissant continuer jusqu'à ce que la synchronisation se termine normalement.

16voto

KernelSanders Points 1046

Cela revient à peu près à la même chose que la réponse de Peter, mais donne à l'utilisateur la possibilité de choisir le fichier distant qu'il veut et l'endroit où il veut le sauvegarder (tout en effectuant le rsync via ssh). Remplacez USER et HOST par votre nom d'utilisateur et votre hôte respectivement.

#!/bin/bash
echo -e "Please enter the full (escaped) file path:"
read -r path
echo "Path: $path"
echo -e "Enter the destination:"
read -r dst
echo "Destination: $dst"
while \[ 1 \]
do
    rsync --progress --partial --append -vz -e ssh "USER@HOST:$path" $dst
    if \[ "$?" = "0" \] ; then
        echo "rsync completed normally"
        exit
    else
        echo "rsync failure. Retrying in a minute..."
        sleep 60
    fi
done

Les options rsync utilisées ici permettent d'afficher les statistiques de progression pendant le transfert, de sauvegarder des fichiers partiels en cas d'échec inattendu et d'ajouter des fichiers partiellement terminés lors de la reprise. L'option -v augmente la verbosité, l'option -z active la compression (bonne pour une connexion lente, mais nécessite plus de puissance de calcul aux deux extrémités), et l'option -e nous permet d'effectuer ce transfert via ssh (l'encryptage est toujours bon à prendre).

Remarque : N'utilisez ceci que si vous avez activé la connexion par clé publique avec votre ssh, sinon il vous demandera un mot de passe lorsqu'il redémarrera (tuant toute fonctionnalité du script).

7voto

Turn Points 151

Un moyen rapide et pratique de le faire lorsque vous n'avez pas envie d'ouvrir un éditeur :

while ( ! rsync -avzP <source> <dest> ); do sleep 1; done

-a  archive mode
-v  increase verbosity
-z  compress file data during the transfer
-P  same as --partial --progress

5voto

ugurarpaci Points 51

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

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

2voto

YasiuMaster Points 31

La réponse de @Peter semble être très utile, mais pour moi il était important d'utiliser --update option. Après la reprise de la connexion, sans --update rsync essayait de tout synchroniser depuis le début. Avec --update les fichiers qui existent déjà sont ignorés.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X