Cómo llamar repetidamente a rsync hasta que los archivos se transfieran correctamente

27

Estoy tratando de sincronizar archivos de un servidor remoto que no es confiable, lo que significa que la conexión tiende a fallar "al azar" con

rsync: conexión inesperadamente cerrada

Rsync se llama con --partial, por lo que me gustaría poder llamar a rsync en un bucle hasta que los archivos se transfieran por completo. No parece haber una bandera para decirle a rsync que vuelva a intentarlo.

¿Cuál sería la mejor manera de escribirlo? ¿Una fiesta de bucle?

Bruno Lopes
fuente
1
Si bien las respuestas a continuación son útiles, podría ser una mejor idea averiguar por qué está fallando y hacer que se detenga. Supongo que controla el servidor, el cliente y la red intermedia, por lo que puede ejecutar tcpdump en varios lugares para ver cómo se cerró. ¿Quizás uno de sus cortafuegos o dispositivos VPN está cerrando la conexión?
MarkR
El servidor al que se está conectando es un host compartido, por lo que no tengo acceso root al mismo. Podría investigar por qué se está cerrando, pero por ahora estoy más que feliz de que vuelva a intentarlo. Gracias de todos modos por el aviso
Bruno Lopes
Me sorprendió descubrir que rsync en realidad no tenía la capacidad de volver a intentarlo.
Michael
rsync --partial --append tiene la capacidad de reintentar, manualmente o en un script que verifica el código de retorno. Duplicado de: superuser.com/questions/302842/...
rickfoosusa

Respuestas:

29

Si está sincronizando todo en una sincronización, llame a rsync en un bucle hasta que rsync le proporcione un código de retorno exitoso.

Algo como:

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

Esto hará un bucle, llamando a rsync, hasta que obtenga un código de retorno de 0. Es posible que desee agregar una suspensión allí para evitar DOSing su servidor.

David
fuente
28
puedes escribir mientras! rsync -a ....; duerme 5; hecho
Justin
1
solo tenga cuidado de cómo usa esto, por ejemplo, si intenta ejecutarlo a través de cron, entonces podría tener problemas de concurrencia.
Keiran Holloway
3
Esto se convertirá en un bucle infinito si hay un error no transitorio (por ejemplo, un error de permisos al leer o escribir archivos). Recomiendo verificar el estado de salida de rsync para errores de red específicos, algo como RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](o cualquier estado de salida que esté viendo en las caídas de red).
Gordon Davisson el
1
Como no estoy ejecutando esto (completamente) sin supervisión, los bucles infinitos y la concurrencia no son un gran problema, gracias.
Bruno Lopes
2
Es una pena que rsync no tenga esta característica incorporada, porque cualquier tipo de bucle basado en shell solicitará una contraseña en los casos en que la autenticación automática no esté disponible o no sea adecuada.
Michael
1

purting todo junto con 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
Kit de herramientas
fuente