Linux: Synchronisieren Sie Dateien kontinuierlich in eine Richtung

61

Szenario: Eine IDE wird auf einer Linux-Desktop-Box eingerichtet und bearbeitet PHP-Dateien lokal. Jedes Mal, wenn ich eine Datei speichere, soll diese Änderung auf dem Linux-Server angezeigt werden, auf dem Apache ausgeführt wird. Der Server hat ssh (und Samba und NFS für diese Angelegenheit).

Als Referenz, als ich Dateien unter Windows bearbeitete, kam ich endlich über WinSCP als genau das Werkzeug, das ich brauchte - WinSCP bietet genau diese Funktion mit anfänglicher Synchronisierung und anschließendem kontinuierlichen Update unter Verwendung des Dateisystem-Überwachungsdienstes: "Keep Remote Directory up to Datum".

Unter Linux könnte man argumentieren, dass sshfs eingesetzt werden könnte, um die Notwendigkeit einer vollständigen Synchronisation zu umgehen. Unter Windows würde eine Samba-Freigabe dasselbe tun. Ich möchte jedoch, dass die IDE mit lokalen Dateien (auf einer SSD-Festplatte!) Arbeitet und nicht über das Netzwerk gehen muss, um PHP-Indizierungen und so weiter durchzuführen, was ewig dauert.

Aber sshfs könnte trotzdem ein Teil der Lösung sein - so dass die kontinuierliche Synchronisation nur zwischen zwei lokalen Verzeichnissen erfolgen musste.

Irgendwelche Ideen oder Hinweise?

stolsvik
quelle
Verwenden Sie das rsync-Tool oder geben Sie einen Ordner im Dokumentenstamm des Webservers frei, damit Sie die Dateien direkt unter Windows
bearbeiten können
2
rsync ist "one go". Ich benötige fortlaufende Updates, das ist der ganze Punkt hier - ich bearbeite eine Datei, speichere sie und das Produkt / System / die Idee, die ich anfordere, würde diese Speicheraktion aufgreifen und die neue Version sofort hochladen. NB: Beide Seiten sind Linux. NB2: Ich möchte lokale Dateien bearbeiten, sonst würde sshfs es selbst schneiden.
Stolsvik
6
Off-Topic-Wähler, dies ist ein Grenzfall, aber ich denke, es fällt ziemlich deutlich unter "Tools, die häufig von Programmierern verwendet werden" in den FAQ.
Karl Bielefeldt
Es ist zwar keine perfekte Übereinstimmung, aber Sie können sich Overlayfs ansehen
phs

Antworten:

57

Sie können auch inotifywaitdas Paket inotify-tools verwenden.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done
Michał Šrajer
quelle
13
Auf der inotify-tools-Website gibt es ein ziemlich gutes Beispiel für die Verwendung von inotify-wait, um einen Rsync auszulösen.
Karl Bielefeldt
Ich habe genau das letzte Nacht gesucht! ahhh Ich liebe Superuser
CenterOrbit
Gibt es eine Möglichkeit, dies zu tun, aber die Steckdose offen zu halten? rsync/ scphat eine nervige Verzögerung beim Aufbau der ssh-Verbindung.
Flash
1
@Flash Ja, Sie können SSH-Multiplexing verwenden , um den Socket offen zu halten.
Will Angley
31

Lsyncd wäre dafür eine gute Lösung.

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.

Unterm Strich werden für die Ausführung der Arbeit dieselben Tools verwendet (inotify und rsync), die in anderen Antworten vorgeschlagen wurden, aber es ist einfacher, sie für Personen einzurichten, die mit Shell-Skripten nicht vertraut sind.

jcharaoui
quelle
Es ist nicht nur einfacher, sondern versucht auch, Situationen wie das Verschieben von Verzeichnissen ohne Synchronisierung richtig zu handhaben.
Ciantic
5
Achtung: Dieses Programm hat einige problematische Funktionen. So schreiben Sie das: 1. Es löscht entfernte Dateien, die standardmäßig nicht an der Quelle vorhanden sind. 2. "remote:" bezieht sich auf "remote: /" anstelle des Basisordners. 3. Es dämonisiert, so dass Sie nicht wissen, was los ist. 4. Das TERM-Signal wird nicht sofort berücksichtigt.
Friedrich
27

Ich brauche das sehr, da mein Code auf Remote-Boxen ausgeführt werden muss und ich Code auf einem lokalen Computer schreibe. Ich habe ein nützliches Tool gefunden, mit dem Sie Ihre lokalen Ordner fortlaufend überwachen und mit Remote- oder lokalen Ordnern synchronisieren können: https://github.com/axkibe/lsyncd

Ein einfacher Befehl zum kontinuierlichen Synchronisieren eines lokalen Verzeichnisses mit einem Remote-Computer über ssh lautet:

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

Vergewissern Sie sich wie bei jedem anderen rsync-Befehl, dass Sie den Ordnerpfad richtig angegeben und überprüft haben, bevor Sie den Befehl ausführen. Ich hätte fast einen meiner Remote-Computer getötet, weil ich kein korrektes Zielverzeichnis angegeben habe. Stellen Sie sicher, dass Sie den Remote-Pfad nicht verpassen und '/' nicht verwenden, es sei denn, Sie wissen, was Sie tun.

Harry
quelle
Dies verdient viel mehr Gegenstimmen, auch drei Jahre nachdem es veröffentlicht wurde
FliiFe
Funktioniert super, habe es endlich auf meinem Mac OS Sierra zum Laufen gebracht, funktioniert super.
Erik van de Ven
2

Wenn Sie das Dateisystem beobachten müssen, ist inotify der richtige Weg, dies zu tun. Ich würde ein einfaches Python-Skript mit pyinotify schreiben , um die Synchronisierung durchzuführen, wenn das Dateisystem geändert wird. Siehe Dokumentation . Sie können sich auch von autosync.py inspirieren lassen. Habe Spaß.

Michał Šrajer
quelle
1

Was ich einmal gemacht habe, ist, dass ein Bash-Skript ls -lin einer Schleife ausgeführt wird (mit etwas Ruhezustand) und mit der vorherigen Ausgabe verglichen wird. Wenn es sich geändert hat, führen Sie die Synchronisierung durch.

#!/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

Starten Sie dieses Skript in einem neuen Terminal mit den Dateinamen als Argumente (nach dem Einfügen Ihres Synchronisationstools).

(Ich habe dies verwendet, um eine Kompilierung zu starten, nicht um zu synchronisieren, aber dies würde auf ähnliche Weise funktionieren.)

Paŭlo Ebermann
quelle
-1

Viel einfacher Ansatz:

Exportiere dein / var / www mit Samba (oder nfs) und bearbeite die Dateien direkt auf dem Server.

Eine andere Lösung: Die meisten IDEs erlauben verschiedene Bereitstellungskonfigurationen - prüfen Sie, ob eine für Sie geeignet ist.

Oder legen Sie ein Quellcode-Verwaltungssystem wie Git, Bazaar usw. fest.

Viel Glück !!

Dragos
quelle
3
Danke für die Antwort. Allerdings habe ich genau diesen Ansatz in der Frage ausdrücklich ausgeschlossen.
Stolsvik