¿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?


¿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.


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).


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 root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

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]


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.