¿Reanudar rsync a través de SSH después de una conexión interrumpida?

45

Tengo que transferir grandes cantidades de datos (> 80 GB) a través de ssh usando rsync. Todo funciona bien, pero la conexión DSL desde donde se envían los datos de la copia de seguridad se reducirá una vez cada 24 h durante un máximo de 3 minutos (cambiar de proveedor no es una opción).

Cómo puedo:

  1. ¿Reiniciar automáticamente la transferencia cuando se vuelve a realizar la conexión?

  2. ¿Asegúrate de que no hay por accidente dos comandos rsync ejecutándose al mismo tiempo?

Sathyajith Bhat
fuente
¿No puedes consultar el código de retorno? while ./run_script; do echo "Retrying..."; done; echo "Done."Asegúrate de que run_scriptregrese 0el éxito
Kerrek SB
Posible duplicado de serverfault.com/q/98745 .
tanius
Alguna información útil aquí: solo quiero agregar que una forma de solucionar el problema de pedir una contraseña repetidamente es usar el comando 'sshpass'. Por lo general, esto debe instalarse con apt-get, etc.
Rachael Saunders

Respuestas:

52

Lo siguiente debería ser útil:

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

Cuando se corta la conexión, rsync se cerrará con un código de salida distinto de cero. Este script simplemente sigue ejecutando rsync, dejándolo continuar hasta que la sincronización se complete normalmente.

Peter
fuente
1
Gracias, estoy intentando esto ahora ... pero debería esto: if ["$?" = "0"] no ser: if ["$?" == "0"] (operador de comparación)?
1
No, en bash "=" es la igualdad de cadena (¡creo que es una de las muchas cosas que lo hace confuso!)
Peter
66
== es alias para =: D
bbaja42
8
Ah, es bueno saberlo. bash nunca dejará de sorprenderme / horrorizarme :-P
Peter
2
Tarde a la fiesta, sin embargo, para la posteridad: A) solo use: if rsync -avz --partial source dest; entonces ... B) si desea comparar valores integrales si usa paréntesis dobles para la expansión aritmética: if (($? = 0)) entonces;
user18402
7

Esto hace lo mismo que la respuesta de Peter, pero le da al usuario la opción de qué archivo remoto desea y dónde quiere guardarlo (además de realizar el rsync a través de ssh). Reemplace el USUARIO y el ANFITRIÓN con su nombre de usuario y host respectivamente.

#! / bin / bash
echo -e "Ingrese la ruta completa del archivo (escapado):"
ruta de lectura -r
echo "Ruta: $ ruta"
echo -e "Ingrese el destino:"
leer -r dst
echo "Destino: $ dst"
mientras [1]
hacer
    rsync --progress --partial --append -vz -e ssh "USUARIO @ HOST: $ ruta" $ dst
    si ["$?" = "0"]; entonces
        echo "rsync completado normalmente"
        salida
    más
        echo "rsync failure. Reintentando en un minuto ..."
        dormir 60
    fi
hecho

Las opciones de rsync utilizadas aquí permiten las estadísticas de progreso durante la transferencia, el almacenamiento de archivos parciales en caso de falla inesperada y la capacidad de agregar archivos parcialmente completados al reanudar. La opción -v aumenta la verbosidad, la opción -z permite la compresión (buena para una conexión lenta, pero requiere más potencia de CPU en ambos extremos), y la opción -e nos permite realizar esta transferencia a través de ssh (el cifrado siempre es bueno).

Nota: Use esto solo si tiene habilitado el inicio de sesión de clave pública con su ssh; de lo contrario, le pedirá una contraseña cuando se reinicie (eliminando todas las funciones del script).

KernelSanders
fuente
1
Esta es la mejor respuesta de la pregunta original. También se aplica a un duplicado con la respuesta incorrecta en: serverfault.com/questions/98745/…
rickfoosusa el
5

supervisor daemon (un administrador de control de procesos) podría funcionar muy bien después de crear certificados rsa de ambos lados, con una configuración similar a la siguiente: (/ etc / supervisor / supervisord.conf es la ruta del archivo de configuración en sistemas basados ​​en Debian)

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

La respuesta de @Peter parece ser muy útil, pero para mí fue importante usar la --updateopción. Después de que se reanudó la conexión, sin --updatersync intentaba sincronizar todo desde el principio. Con --update, se omiten los archivos que ya existen.

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

YasiuMaster
fuente
2
--updateomite los archivos que ya existen ... Incluidos los que no se han copiado completamente en el destino. Creo que va en contra de la mayoría de los casos de uso.
Durm
@durum no es cierto al menos en rsync 3.1.2. después de la transferencia interrumpida veo que funciona correctamente en el mismo archivo. Usé rsync sobre ssh, el comando era rsync --partial --update file1 remotehost:file1. después de transferir el 15% rompí la transferencia (kill -KILL).
filiprem