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

18

Je peux synchroniser des dossiers avec rsync -avz /directory /target, maintenant je souhaite le faire si j'ai changé un fichier dans /directorydonc rsyncdevrait être appelé automatiquement.

J'utilise Virtual Box et le dossier partagé de Virtual Box est vraiment lent, surtout si vous avez une page Web qui utilise le dossier partagé comme racine du document. Avec rsyncje serais en mesure 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, ce crontabne serait pas bien, car il est exécuté toutes les x minutes, donc si je ne fais rien, il appellera toujours rsyncmais pas si j'ai modifié mon fichier.

Meilleures salutations

BlackScorp
la source

Réponses:

18

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

rsyncsynchronisera uniquement les fichiers qui ont été modifiés. Si rien n'a changé, il se fermera. C'est vraiment un surcoût minime.

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 fois que vous économiserez.

Oli
la source
1
bien le problème semble-t-il, que inotify ne peut pas vérifier les dossiers nfs partagés. pour m'assurer, ce que je veux, essayer de décrire j'ai une boîte virtuelle installée avec vagrant, là j'ai un dossier partagé "projets" il est monté au démarrage, tous mes fichiers de serveur web y sont situés donc je peux les modifier sur mon hôte système (win7) comme je l'ai dit, les dossiers partagés de la boîte virtuelle sont vraiment lents, donc la solution pourrait être de synchroniser le dossier nfs monté vers un autre endroit, par exemple / var / www mais les méthodes courantes ne fonctionnent pas, j'ai essayé fileschanged, icrontab, gues gamin ou fam aiderait, mais je ne sais pas comment les démarrer ou les utiliser
BlackScorp
@BlackScorp est réaliste, vous êtes coincé avec simplement crs de rsync et le laisser décider ce qui doit être synchronisé. Comme je l'indique dans la réponse, ce n'est pas une très mauvaise option.
Oli
1
L'autre option consiste à pousser les fichiers depuis l'hôte plutôt que d'essayer de détecter les modifications à distance.
Oli
Eh bien, cette solution que j'ai utilisée auparavant, elle a 2 problèmes: 1) J'ai dû me reconnecter à chaque fois à ma boîte virtuelle pour modifier des fichiers, ce qui signifie que mon virtuel doit fonctionner, l'édition rapide ne fonctionne plus 2) Je ne sais pas pourquoi, mais parce que du processus d'analyse de projet de ma samba IDE (Netbeans) montre 99% d'utilisation du CPU et tout dans la boîte virtuelle est juste lent pendant le développement j'essaierai la solution rsyn + cronjob ou la construction php dans le serveur web
BlackScorp
La inotifywaitsolution présente un inconvénient léger mais important: elle ne détecte pas les changements survenus lors de l' rsyncexécution. Considérez la situation suivante: le fichier A est modifié; rsync est déclenché; lorsque rsync a presque terminé la synchronisation du fichier A, le fichier B est modifié. Maintenant, rsyncterminé et en inotifywaitcours d'exécution, mais le fichier B n'est pas synchronisé et ne sera pas synchronisé jusqu'à la prochaine modification. Pensez à utiliserlsyncd comme suggéré par @Arigion.
MarSoft
6

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

Lsyncd surveille une interface de surveillance d'événements d'arborescence de répertoires locaux (inotify ou fsevents). Il agrège 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 légère de miroir en direct qui est relativement facile à installer, ne nécessitant pas de nouveaux systèmes de fichiers ou blocs de périphériques et n'entrave pas les performances du système de fichiers local.

Voici par exemple un tutoriel pour Ubuntu 16.04 .

Arigion
la source
2

Vous pouvez utiliser inotifywaitet rsync. inotifywaitavec l'événement modify,create,deleteactivé. De cette façon, vous ne synchroniserez avec votre serveur que lorsque le fichier change, 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 changements). Ainsi dit:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
silgon
la source
Cela ne détectera pas les changements survenus pendant l'exécution de rsync. Pensez à utiliser lsyncdcomme suggéré par @Arigion.
mars
cela réappliquera tous les événements sur tous les fichiers après chaque changement ... et quand il s'appliquera, il n'y aura aucun changement pendant cette période ...
Quelqu'un
0

En développant légèrement un commentaire sur la réponse acceptée, j'ai réussi à utiliser fswatch pour déclencher un scpdes fichiers modifiés sur l'invité. Sous Linux, il s'agit d'un wrapper, inotifymais il est également multiplateforme (je suis sur un Mac avec un invité QEMU basé sur Arm). J'ai également cloué sur une sshconstruction à distance. L'approche push fonctionne bien avec des actions dont le comportement n'est pas idéal.

Robin Macharg
la source