Wie löse ich rsync bei Dateimodifikationen aus?

18

Ich kann Ordner mit synchronisieren rsync -avz /directory /target, jetzt möchte ich es tun, wenn ich eine Datei darin geändert habe, /directorydamit rsyncsie automatisch aufgerufen werden soll.

Ich verwende Virtual Box und der freigegebene Ordner von Virtual Box ist sehr langsam, besonders wenn Sie eine Webseite haben, die den freigegebenen Ordner als Dokumentenstamm verwendet. Mit rsyncwürde ich in der Lage sein, mit meinen lokalen Akten auf freigegebenem Faltblatt zu arbeiten und es automatisch mit Dokumentenstamm zu synchronisieren.

Ich hoffe, jemand hat eine Idee, wie das geht, crontabwäre nicht gut, da es alle x Minuten ausgeführt wird. Wenn ich also nichts tue, wird es immer noch aufgerufen, rsyncaber nicht, wenn ich meine Datei geändert habe.

Freundliche Grüße

BlackScorp
quelle

Antworten:

18

crontab wäre nicht gut, weil es alle x Sekunden / Minuten ausgeführt wird. Wenn ich also nichts tue, ruft es immer noch rsync auf, aber nicht, wenn ich meine Datei modifiziert habe

rsyncsynchronisiert nur die Dateien, die geändert wurden. Wenn sich nichts geändert hat, wird es beendet. Das ist wirklich ein minimaler Aufwand.

Wenn Sie damit nicht zufrieden sind, können Sie Folgendes verwenden inotifywait:

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

Das wird sofortiger sein, aber es wird Dinge jedes Mal tun, wenn Sie speichern.

Oli
quelle
1
Nun, das Problem scheint, dass inotify nicht in der Lage ist, freigegebene NFS-Ordner zu überprüfen. um sicher zu gehen, was ich will, versuche zu beschreiben, dass ich eine virtuelle Box mit Vagrant installiert habe. Dort habe ich einen freigegebenen Ordner "projects", der beim Booten gemountet wird. Alle meine Webserver-Dateien befinden sich dort, damit ich sie auf meinem Host ändern kann system (win7) wie ich sagte, sind freigegebene ordner der virtuellen box sehr langsam, daher könnte die lösung darin bestehen, den eingebundenen nfs-ordner mit einem anderen ort zu synchronisieren, zb / var / www, aber die üblichen möglichkeiten funktionieren nicht FAM würde helfen, aber ich weiß nicht, wie man sie startet oder verwendet
BlackScorp
@BlackScorp Realistisch gesehen müssen Sie nur noch rsync abrufen und entscheiden lassen, was synchronisiert werden soll. Wie ich in der Antwort voraussage, ist das keine schlechte Option.
Oli
1
Die andere Möglichkeit besteht darin, die Dateien vom Host zu übertragen, anstatt Änderungen aus der Ferne zu erkennen.
Oli
Nun, diese Lösung, die ich zuvor verwendet habe, hat zwei Probleme: 1) Ich musste jedes Mal eine Wiederherstellung meiner virtuellen Box durchführen, um Dateien zu bearbeiten. Das heißt, meine virtuelle muss ausgeführt werden. Die schnelle Bearbeitung funktioniert nicht mehr. 2) Ich weiß nicht warum, aber weil des Projekts Scanprozess meiner IDE (Netbeans) Samba zeigt 99% CPU - Auslastung und alles innerhalb der virtuellen Box ist langsam nur , während ich die rsyn + cronjob Lösung oder die pHP - Build - in Web - Server zu entwickeln versuchen
BlackScorp
Die inotifywaitLösung hat einen kleinen, aber wichtigen Nachteil: Sie erkennt keine Änderungen, die während der rsyncAusführung aufgetreten sind. Stellen Sie sich die folgende Situation vor: Datei A wird geändert; rsync wird ausgelöst; Wenn die Synchronisierung von Datei A fast abgeschlossen ist , wird Datei B geändert. Jetzt rsyncfertig und inotifywaitläuft, aber Datei B ist nicht synchronisiert und wird erst nach einer nächsten Änderung synchronisiert. Erwägen Sie die Verwendung,lsyncd wie von @Arigion vorgeschlagen.
MarSoft
6

Sie könnten Lsyncd (Live Syncing Daemon) verwenden :

Lsyncd überwacht eine Ereignisüberwachungsschnittstelle für lokale Verzeichnisbäume (inotify oder fsevents). Es aggregiert und kombiniert Ereignisse für einige Sekunden und erzeugt dann einen (oder mehrere) Prozesse, um die Änderungen zu synchronisieren. Standardmäßig ist dies rsync. Lsyncd ist somit eine leichte Live Mirror-Lösung, die vergleichsweise einfach zu installieren ist und keine neuen Dateisysteme oder Blockgeräte erfordert und die Leistung des lokalen Dateisystems nicht beeinträchtigt.

Hier ist zum Beispiel ein Tutorial für Ubuntu 16.04 .

Arigion
quelle
2

Sie können inotifywaitund verwenden rsync. inotifywaitmit dem Ereignis modify,create,deleteaktiviert. Auf diese Weise werden Sie nur dann mit Ihrem Server synchronisiert, wenn sich die Datei ändert. Andernfalls wird die Synchronisierung immer dann durchgeführt, wenn eine Datei gelesen wird. So heißt es:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
Silgon
quelle
Während rsync ausgeführt wird, werden Änderungen nicht erkannt. lsyncdErwägen Sie die Verwendung, wie von @Arigion vorgeschlagen.
MarSoft
Dadurch werden alle Ereignisse nach jeder Änderung erneut auf alle Dateien angewendet ... und wenn es angewendet wird, wird in diesem Zeitraum keine Änderung festgestellt ...
Jemand vom
0

Erweitern eines Kommentars zur akzeptierten Antwort Ich hatte Erfolg damit, fswatch zu verwenden, um eine scpder geänderten Dateien für den Gast auszulösen . Unter Linux ist dies ein Wrapper, inotifyaber es ist auch plattformübergreifend (ich habe einen Mac mit einem QEMU-Gast, der auf Arm basiert). Ich habe auch einen sshRemote-Build angepackt . Der Push-Ansatz eignet sich gut für Aktien, die sich nicht optimal verhalten.

Robin Macharg
quelle