Comment puis-je vérifier si rsync a apporté des modifications dans bash?


12

J'ai un script qui utilise rsync pour synchroniser les données dans un scénario distant -> local. Immédiatement après l'exécution de la commande rsync, vérifiez si le code d'erreur est égal à zéro ou non. Si son zéro, d'autres commandes sont exécutées. Cependant, cela ne prend pas en compte le fait que rsync a pu s'exécuter correctement mais n'a en fait apporté aucune modification. De ce fait, la condition zéro égal fonctionnera indépendamment, ce qui est un peu redondant.

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

Quelle serait la meilleure approche pour développer cela afin de vérifier s'il y avait réellement des changements basés sur la commande rsync qui a été exécutée. J'ai lu que l'indicateur -i peut fournir une sortie à stdout, mais comment cela peut-il être placé dans un bloc conditionnel?


Vous y êtes -v, donc il fournit déjà les informations dont vous avez besoin pour sortir ... par exemple, une liste des fichiers qui ont été réellement envoyés. Si rien n'est changé, c'est juste ./.
goldilocks

Ah! Que se passe-t-il si je supprime -v et utilise -i à la place, puis utilise une vérification de chaîne non vide sur la commande rsync?
James White

On dirait que vous avez trouvé la solution vous-même? :-)
Bjorn Munch

2
vous pouvez utiliser a=$("rsync command"). Ceci exécuter la rsynccommande et le magasin stdouten a. Ensuite, vous pouvez exécuter des tests sura
nitishch

1
Vous pouvez également ajouter un | grep /ou quelque chose comme ça, puis vérifier l'état de sortie de grep avec $?, il devrait être 1 s'il n'y a pas de sortie.
Bjorn Munch

Réponses:


9

Sur la base des commentaires de ma question d'origine, effectuez une sortie rsync vers stdout avec l'indicateur -i et utilisez une condition de vérification non chaîne pour voir si quelque chose a réellement changé dans la vérification du code d'erreur. Envelopper la commande rsync dans une variable permet d'effectuer la vérification.

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

Inconvénient potentiel, vous devez perdre la sortie détaillée, mais vous pouvez toujours la consigner dans un fichier à la place.


1

Je voulais une solution plus stricte. Je ne veux pas solliciter Number of created files:(le message pourrait être dans une autre langue) ou supprimer toutes les lignes sauf deux en -vsortie (qui sait quel résumé rsyncsera imprimé dans la prochaine version?).

J'ai trouvé que vous pouvez définir le format du rsyncjournal d'un, mais pas le format de sa sortie standard (voir man rsyncd.conf).

Par exemple, ajoutez un "Fichier modifié!" à chaque ligne avec un fichier réellement modifié, puis greppour cela:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.