Riprendi rsync su SSH dopo una connessione interrotta?


45

Devo trasferire grandi quantità di dati (> 80 GB) su ssh usando rsync. Tutto funziona correttamente, ma la connessione DSL da cui vengono inviati i dati di backup cadrà una volta ogni 24 ore per un massimo di 3 minuti (cambiare fornitore non è un'opzione).

Come posso:

  1. Riavvia automaticamente il trasferimento quando viene eseguito il backup della connessione?

  2. Assicurati che non ci siano per caso due comandi rsync in esecuzione contemporaneamente?


Non riesci a controllare il codice di ritorno? while ./run_script; do echo "Retrying..."; done; echo "Done."Assicurati che run_scriptritorni 0sul successo.
Kerrek SB,

Possibile duplicato di serverfault.com/q/98745 .
tanius,

Alcune informazioni utili qui - Voglio solo aggiungere che un modo per aggirare il ripetuto problema di richiesta password è usare il comando 'sshpass'. Di solito questo deve essere installato con apt-get ecc.
Rachael Saunders,

Risposte:


52

Quanto segue dovrebbe essere 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

Quando la connessione si interrompe, rsync si chiuderà con un codice di uscita diverso da zero. Questo script continua semplicemente a rieseguire rsync, lasciandolo continuare fino al completamento normale della sincronizzazione.


1
Grazie, ci sto provando ora ... ma dovrebbe: se ["$?" = "0"] non essere: se ["$?" == "0"] (operatore di confronto)?

1
No, in bash "=" è l'uguaglianza delle stringhe (una delle tante cose che la confonde, penso!)
Peter,

6
== è alias per =: D
bbaja42

8
Ah, buono a sapersi. bash non cesserà mai di stupirmi / spaventarmi :-P
Peter,

2
In ritardo alla festa, tuttavia per i posteri: A) basta usare: se rsync -avz - dest sorgente parziale; quindi ... B) se si desidera confrontare i valori integrali se si usa la doppia parentesi per l'espansione aritmetica: if (($? = 0)) then;
user18402

7

Questo ha lo stesso effetto della risposta di Peter, ma offre all'utente l'opzione di quale file remoto desidera e dove vuole salvarlo (oltre a condurre il rsync su ssh). Sostituisci USER e HOST con il tuo nome utente e host rispettivamente.

#! / Bin / bash
echo -e "Inserisci il percorso completo (con escape) del file:"
leggi -r percorso
echo "Path: $ path"
echo -e "Inserisci la destinazione:"
leggi -r dst
echo "Destinazione: $ dst"
mentre [1]
fare
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ percorso" $ dst
    se ["$?" = "0"]; poi
        echo "rsync completato normalmente"
        Uscita
    altro
        echo "errore rsync. Riprovare tra un minuto ..."
        dormire 60
    fi
fatto

Le opzioni rsync utilizzate qui abilitano le statistiche sull'avanzamento durante il trasferimento, il salvataggio di file parziali in caso di errore imprevisto e la possibilità di aggiungere file parzialmente completati al riavvio. L'opzione -v aumenta la verbosità, l'opzione -z consente la compressione (buona per una connessione lenta, ma richiede più potenza della cpu su entrambe le estremità) e l'opzione -e ci consente di effettuare questo trasferimento su ssh (la crittografia è sempre buona).

Nota: usalo solo se hai abilitato l'accesso con chiave pubblica con il tuo ssh, altrimenti ti chiederà una password al riavvio (uccidendo tutte le funzionalità dello script).


1
Questa è la migliore risposta alla domanda originale. Si applica anche a un duplicato con la risposta errata su: serverfault.com/questions/98745/…
rickfoosusa,

5

il demone supervisore (un gestore controllo processi) potrebbe funzionare molto bene dopo aver creato i certificati rsa di entrambi i lati, con una configurazione simile come segue: (/ etc / supervisor / supervisord.conf è il percorso del file di configurazione sui sistemi basati su debian)

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

1

La risposta di @Peter sembra essere molto utile, ma per me è stato importante usare l' --updateopzione. Dopo che la connessione è stata ripresa, senza --updatersync stava cercando di sincronizzare tutto dall'inizio. Con --update, i file già esistenti vengono saltati.

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


2
--updatesalta i file già esistenti ... Compresi quelli che non sono stati completamente copiati sulla destinazione. Penso che vada contro la maggior parte dei casi d'uso.
Durum,

@durum non è vero almeno su rsync 3.1.2. dopo il trasferimento interrotto vedo che funziona correttamente sullo stesso file. Ho usato rsync su ssh, il comando era rsync --partial --update file1 remotehost:file1. dopo aver trasferito il 15% ho interrotto il trasferimento (uccisione -KILL).
Filiprem,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.