Come posso verificare se rsync ha apportato modifiche in bash?


12

Ho uno script che utilizza rsync per sincronizzare i dati in uno scenario remoto -> locale. Immediatamente dopo l'esecuzione del comando rsync, un controllo per vedere se il codice di errore è uguale a zero o meno. Se è zero, vengono eseguiti ulteriori comandi. Ciò tuttavia non tiene conto del fatto che rsync potrebbe essere stato eseguito correttamente ma in realtà non ha apportato modifiche. Per questo motivo la condizione zero uguale verrà eseguita indipendentemente, il che è un po 'ridondante.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Quale sarebbe l'approccio migliore per espanderlo per verificare se c'erano effettivamente delle modifiche basate sul comando rsync eseguito. Ho letto che -i flag può fornire output a stdout, ma come può essere inserito in un blocco condizionale?


Ci sei entrato -v, quindi sta già fornendo le informazioni necessarie per stdout ... ad esempio, un elenco di file che sono stati effettivamente inviati. Se nulla è cambiato, è giusto ./.
Riccioli d'oro

Ah! Che cosa succede se ho eliminato -v e utilizzo invece -i e quindi utilizzo un controllo stringa non vuoto sul comando rsync?
James White,

Sembra che tu abbia trovato la soluzione da solo? :-)
Bjorn Munch

2
puoi usare a=$("rsync command"). Ciò eseguire il rsynccomando e il negozio stdoutin a. Quindi puoi eseguire i test sua
nitishch il

1
Puoi anche aggiungere uno | grep /o qualcosa del genere, quindi controllare lo stato di uscita di grep con $?, dovrebbe essere 1 se non ci fosse output.
Bjorn Munch,

Risposte:


9

Sulla base dei commenti alla mia domanda originale, esegui l'output di rsync su stdout con il flag -i e usa una condizione di controllo non stringa per vedere se qualcosa è effettivamente cambiato nel controllo del codice di errore. L'avvolgimento del comando rsync in una variabile consente di eseguire il controllo.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Potenziale svantaggio, devi perdere l'output dettagliato, ma puoi sempre registrarlo in un file.


1

Volevo una soluzione più rigorosa. Non voglio grep per Number of created files:(il messaggio potrebbe essere in un'altra lingua) o rimuovere tutte le righe tranne due -vnell'output (chissà quale riepilogo rsyncverrà stampato nella prossima versione?).

Ho scoperto che puoi impostare il formato del rsyncregistro di un, ma non il formato del suo stdout (vedi man rsyncd.conf).

Ad esempio, aggiungi un "File modificato!" a ciascuna riga con un file effettivamente modificato, quindi grepper esso:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
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.