Jak uruchomić rsync podczas modyfikacji pliku?

18

Mogę zsynchronizować foldery rsync -avz /directory /target, teraz chcę to zrobić, jeśli zmieniłem plik, /directorywięc rsyncpowinien zostać wywołany automatycznie.

Korzystam z Virtual Box, a folder współdzielony Virtual Box jest naprawdę wolny, szczególnie jeśli masz stronę internetową, która używa folderu współdzielonego jako katalogu głównego dokumentu. Dzięki rsyncmógłbym pracować z moimi lokalnymi plikami w folderze współdzielonym i automatycznie synchronizować je z katalogiem głównym dokumentu.

Mam nadzieję, że ktoś ma pomysł, jak to zrobić, crontabnie byłoby dobrze, ponieważ jest wykonywany co x minut, więc jeśli nic nie zrobię, zadzwoni, rsyncale nie, jeśli zmodyfikuję mój plik.

Z poważaniem

BlackScorp
źródło

Odpowiedzi:

18

crontab nie byłby dobry, ponieważ jest wykonywany co x sekund / minut, więc jeśli nic nie zrobię, nadal wywoła rsync, ale nie, jeśli zmodyfikowałem mój plik

rsynczsynchronizuje tylko zmienione pliki. Jeśli nic się nie zmieni, zakończy działanie. To naprawdę minimalny narzut.

Jeśli nie jesteś zadowolony z tego, możesz użyć inotifywait:

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

To będzie bardziej natychmiastowe, ale będzie działać za każdym razem, gdy oszczędzasz.

Oli
źródło
1
problem wydaje się, że inotify nie jest w stanie sprawdzić udostępnionych folderów NFS. aby upewnić się, co chcę, spróbuj opisać, że mam zainstalowany wirtualny box z włóczęgą, tam mam folder współdzielony „projekty” jest on montowany podczas uruchamiania, wszystkie moje pliki serwera WWW są tam umieszczone, więc mogę je modyfikować na moim hoście system (win7), jak powiedziałem, że foldery współdzielone z wirtualnym pudełkiem są naprawdę wolne, więc rozwiązaniem może być zsynchronizowanie zamontowanego folderu nfs z innym miejscem np. / var / www, ale typowe sposoby nie działają, próbowałem zmiany plików, icrontab, gues gamin lub fam pomógłby, ale nie wiem, jak je uruchomić lub używać
BlackScorp
@BlackScorp realistycznie utknąłeś z cronningiem rsync i pozwalaniem mu decydować, co wymaga synchronizacji. Jak prowadzę w odpowiedzi, nie jest to straszna zła opcja.
Oli
1
Inną opcją jest wypychanie plików z hosta zamiast zdalne wykrywanie zmian.
Oli
Cóż, to rozwiązanie, z którego korzystałem wcześniej, ma 2 problemy: 1) Musiałem za każdym razem ponownie łączyć się z wirtualnym pudełkiem, aby edytować pliki, co oznacza, że ​​mój wirtualny musi działać, szybka edycja już nie działa 2) Nie wiem dlaczego, ale ponieważ procesu skanowania projektu mojej IDE (Netbeans) samba pokazuje wykorzystanie procesora na 99%, a wszystko w wirtualnym pudełku jest po prostu powolne podczas opracowywania, spróbuję rozwiązania rsyn + cronjob lub wbudowanego php na serwerze
BlackScorp
inotifywaitRozwiązanie ma jedną istotną wadę, ale nieznaczne: to nie wykrywa zmian, które się stało, kiedy rsyncjest uruchomiony. Rozważ następującą sytuację: plik A został zmieniony; rsync jest wyzwalany; kiedy rsync prawie kończy synchronizację pliku A, plik B ulega zmianie. Teraz rsynczakończone i inotifywaitdziała, ale plik B nie jest zsynchronizowany i nie zostanie zsynchronizowany aż do następnej zmiany. Rozważ użycielsyncd zgodnie z sugestią @Arigion.
MarSoft,
6

Możesz użyć Lsyncd (Live Syncing Daemon) :

Lsyncd obserwuje interfejs monitorowania zdarzeń lokalnego drzewa katalogów (inotify lub fsevents). Agreguje i łączy zdarzenia przez kilka sekund, a następnie spawnuje jeden (lub więcej) procesów w celu synchronizacji zmian. Domyślnie jest to rsync. Lsyncd jest zatem lekkim rozwiązaniem do tworzenia kopii lustrzanych na żywo, które jest stosunkowo łatwe do zainstalowania, nie wymaga nowych systemów plików ani blokuje urządzeń i nie wpływa na wydajność lokalnego systemu plików.

Oto na przykład samouczek dotyczący systemu Ubuntu 16.04 .

Arigion
źródło
2

Możesz użyć inotifywaiti rsync. inotifywaitz modify,create,deletewłączonym zdarzeniem . W ten sposób zsynchronizujesz się z serwerem tylko wtedy, gdy plik się zmieni, w przeciwnym razie zsynchronizuje się za każdym razem, gdy plik zostanie odczytany (redaktorzy czytają plik kilka razy, aby sprawdzić, czy są jakieś zmiany). Tak powiedziane:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
silgon
źródło
Nie wykryje to zmian, które nastąpiły podczas działania rsync. Rozważ użycie lsyncdzgodnie z sugestią @Arigion.
MarSoft,
spowoduje to ponowne zastosowanie wszystkich zdarzeń do wszystkich plików po każdej zmianie ... a po zastosowaniu nie zobaczy żadnych zmian w tym okresie ...
Ktoś
0

Rozwijając nieco komentarz do zaakceptowanej odpowiedzi, miałem sukces przy użyciu fswatch do wywołania scpzmienionych plików dla gościa. W Linuksie jest to opakowanie uniwersalne, inotifyale jest także wieloplatformowe (jestem na komputerze Mac z gościem QEMU z Arm). Skorzystałem również z wersji sshzdalnej. Metoda push działa dobrze z udziałami, które zachowują się w mniej niż idealny sposób.

Robin Macharg
źródło