Linux: ciągła synchronizacja plików w jedną stronę

61

Scenariusz: IDE jest skonfigurowane na komputerze stacjonarnym z Linuksem, lokalnie edytując pliki PHP. Za każdym razem, gdy zapisuję plik, chcę, aby ta zmiana pojawiła się na serwerze Linux, na którym działa Apache. Serwer ma ssh (i samba i nfs w tym zakresie).

Jako odniesienie, kiedy edytowałem pliki w systemie Windows, w końcu znalazłem WinSCP jako dokładne narzędzie, którego potrzebowałem - WinSCP ma właśnie tę funkcję, z początkową synchronizacją, a następnie ciągłą aktualizacją, za pomocą usługi obserwowania systemu plików: „Zachowaj zdalny katalog do Data".

W systemie Linux można argumentować, że można zastosować sshfs, aby całkowicie ominąć potrzebę synchronizacji. W systemie Windows udział samba zrobiłby to samo. Jednak chcę, aby IDE działało z plikami lokalnymi (na dysku SSD!), Bez konieczności przechodzenia przez sieć w celu indeksowania PHP i tym podobnych, co zajmuje wieki.

Niemniej jednak sshfs może być częścią rozwiązania - tak więc ciągła synchronizacja musiała zostać wykonana między dwoma lokalnymi katalogami.

Jakieś pomysły lub wskazówki?

Stolsvik
źródło
rozważ skorzystanie z narzędzia rsync lub udostępnienie folderu w katalogu głównym serwera, aby móc operować plikami bezpośrednio pod oknami
Vinicius Kamakura
2
rsync to „jednorazowo”. Potrzebuję ciągłych aktualizacji, o to właśnie tu chodzi - edytuję plik, zapisuję go, a produkt / system / pomysł, o który poproszę, wybrałby tę akcję zapisywania i natychmiast przesłał nową wersję. NB: Obie strony to Linux. NB2: Chcę edytować na lokalnych plikach, bo inaczej sshfs by je wyciął.
stolsvik,
6
Wyborcy poza tematem to sprawa graniczna, ale myślę, że dość wyraźnie mieści się w „narzędziach powszechnie używanych przez programistów” w FAQ.
Karl Bielefeldt
Choć nie jest to idealne dopasowanie, można spojrzeć na overlayfs
PHS

Odpowiedzi:

57

Możesz także skorzystać inotifywaitz pakietu inotify-tools.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done
Michał Šrajer
źródło
13
Na stronie internetowej inotify-tools jest całkiem dobry przykład użycia inotify-wait do uruchomienia rsync.
Karl Bielefeldt,
Dokładnie tego szukałem ostatniej nocy! ahhh Uwielbiam superużytkownika
CenterOrbit
Czy jest na to sposób, ale należy pozostawić gniazdo otwarte? rsync/ scpma irytujące opóźnienie podczas nawiązywania połączenia ssh.
Błysk
1
@ Flash tak, możesz użyć multipleksowania SSH, aby utrzymać gniazdo otwarte.
Will Angley,
31

Lsyncd byłoby dobrym rozwiązaniem.

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 zsynchronizowania zmian. Domyślnie jest to rsync. Lsyncd jest zatem lekkim rozwiązaniem Live Mirror, które jest stosunkowo łatwe do zainstalowania, nie wymaga nowych systemów plików lub urządzeń blokowych i nie obniża wydajności lokalnego systemu plików.

Podsumowując, używa tego samego rodzaju narzędzi do wykonania zadania (inotify i rsync), jak sugerują inne odpowiedzi, ale łatwiej jest skonfigurować kogoś, kto nie zna skryptów powłoki.

jcharaoui
źródło
nie tylko łatwiej, ale także stara się odpowiednio radzić sobie z sytuacjami, takimi jak przenoszenie katalogu, bez rsynchronizacji.
Ciantic
5
Uwaga: ten program ma pewne problematyczne funkcje. W chwili pisania tego: 1. Domyślnie usuwa zdalne pliki nieobecne u źródła. 2. „zdalny:” odnosi się do „zdalnego: /” zamiast folderu domowego. 3. Demonizuje, więc nie wiesz, co się dzieje. 4. Nie przestrzega natychmiast sygnału TERM.
Friedrich,
27

Potrzebuję tego bardzo, ponieważ mój kod musi działać na zdalnych urządzeniach i piszę kod na lokalnej maszynie. Znalazłem fajne narzędzie, którego można użyć do ciągłego monitorowania folderów lokalnych i synchronizowania ich z folderem zdalnym lub lokalnym: https://github.com/axkibe/lsyncd

Prostym poleceniem ciągłej synchronizacji lokalnego katalogu z maszyną zdalną przez ssh będzie:

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

Podobnie jak w przypadku każdego innego polecenia rsync, upewnij się, że podałeś prawidłową ścieżkę do folderu i sprawdź przed uruchomieniem polecenia. Prawie zabiłem jedną ze zdalnych maszyn, ponieważ nie udało mi się podać prawidłowego katalogu docelowego. Upewnij się, że nie przegapisz ścieżki zdalnej i nie używaj „/”, chyba że wiesz, co robisz.

złupić
źródło
Zasługuje to na znacznie więcej głosów, nawet trzy lata po opublikowaniu
FliiFe
Działa świetnie, w końcu działa na moim Mac OS Sierra, działa niesamowicie.
Erik van de Ven
2

Jeśli musisz obserwować system plików, możesz to zrobić za pomocą inotify. Napisałbym prosty skrypt Pythona przy użyciu pyinotify, aby przeprowadzić synchronizację po zmianie systemu plików. Zobacz dokumentację . Możesz także pobrać plik autosync.py, aby uzyskać inspirację. Baw się dobrze.

Michał Šrajer
źródło
1

To, co kiedyś zrobiłem, to uruchomienie skryptu bash ls -lw pętli (z pewnym czasem uśpienia) i porównanie z poprzednim wyjściem. Jeśli to się zmieniło, wykonaj synchronizację.

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

Uruchom ten skrypt w nowym terminalu z nazwami plików jako argumentami (po włożeniu narzędzia do synchronizacji).

(Użyłem tego do uruchomienia kompilacji, a nie do synchronizacji, ale działałoby to w podobny sposób.)

Paŭlo Ebermann
źródło
-1

Znacznie prostsze podejście:

Wyeksportuj / var / www z samba (lub nfs) i pracuj nad plikami bezpośrednio na serwerze.

Inne rozwiązanie: większość IDE pozwala na różne konfiguracje wdrażania - sprawdź, czy istnieje taka, która Ci odpowiada.

Lub ustaw system zarządzania kodem źródłowym, taki jak Git, Bazaar itp.

Powodzenia !!

Dragos
źródło
3
Dzięki za odpowiedź. Jednak wyraźnie wykluczyłem to podejście w pytaniu.
stolsvik,