web-dev-qa-db-fra.com

Comment déclencher rsync lors d'une modification de fichier?

Je peux synchroniser des dossiers avec rsync -avz /directory /target. Maintenant, je souhaite le faire si j'ai modifié un fichier dans /directory afin que rsync soit appelé automatiquement.

J'utilise Virtual Box et le dossier partagé de Virtual Box est très lent, surtout si vous avez une page Web utilisant le dossier partagé comme racine du document. Avec rsync, je serais capable de travailler avec mes fichiers locaux sur un dossier partagé et de le synchroniser automatiquement avec la racine du document.

J'espère que quelqu'un a une idée de comment faire. crontab ne serait pas bon, car il est exécuté toutes les x minutes. Si je ne fais rien, il appellera toujours rsync, mais pas si je modifie mon fichier.

Meilleures salutations

18
BlackScorp

crontab ne serait pas bon, car il est exécuté toutes les x secondes/minutes, donc si je ne fais rien, il appellera toujours rsync mais pas si j'ai modifié mon fichier

rsync ne synchronisera que les fichiers qui ont été modifiés. Si rien n'a changé, il va sortir. C'est vraiment une surcharge minimale.

Si vous n'êtes pas satisfait de cela, vous pouvez utiliser inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Ce sera plus instantané, mais cela fera des choses chaque la fois que vous gagnez du temps.

18
Oli

Vous pouvez utiliser Lsyncd (démon de synchronisation en direct) :

Lsyncd surveille une interface de moniteur d'événements d'arbres de répertoires locaux (inotify ou fsevents). Il regroupe et combine les événements pendant quelques secondes, puis génère un (ou plusieurs) processus pour synchroniser les modifications. Par défaut c'est rsync. Lsyncd est donc une solution de miroir dynamique légère et relativement facile à installer, ne nécessitant pas de nouveaux systèmes de fichiers ou de dispositifs de blocage, et n'entrave pas les performances du système de fichiers local.

Voici par exemple un tutoriel pour Ubuntu 16.04 .

6
Arigion

Vous pouvez utiliser inotifywait et rsync. inotifywait avec l'événement modify,create,delete activé. De cette façon, vous ne synchroniserez avec votre serveur que lorsque le fichier sera modifié, sinon il se synchronisera chaque fois qu'un fichier est lu (les éditeurs lisent plusieurs fois votre fichier pour vérifier s'il y a des modifications). Ainsi dit:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
3
silgon

En développant légèrement un commentaire sur la réponse acceptée, je suis parvenu à utiliser fswatch pour déclencher un scp fichier modifié sur l'invité. Sous Linux, il s'agit d'un wrapper autour de inotify mais il est également multi-plateforme (je suis sur un Mac avec un invité QEMU basé sur Arm). J'ai également ajouté une compilation à distance ssh. L'approche Push fonctionne bien avec des actions qui se comportent de manière moins qu'idéale.

0
Robin Macharg