it-swarm.com.de

Linux: Synchronisieren Sie Dateien kontinuierlich in eine Richtung

Szenario: Ein 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 IDE mit lokalen Dateien (auf einer SSD-Festplatte!) Arbeitet, ohne über das Netzwerk gehen zu müssen, um PHP zu indizieren, und so weiter, 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?

58
stolsvik

Sie können auch inotifywait aus dem inotify-tools-Paket verwenden.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done
55
Michał Šrajer

Lsyncd wäre hierfü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 Aufgabe 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.

31
jcharaoui

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 nettes 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.

25
harry

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ß.

2
Michał Šrajer

Was ich einmal gemacht habe, ist ein Bash-Skript, das ls -l in einer Schleife (mit etwas Ruhezustand) ausführt und mit der vorherigen Ausgabe vergleicht. 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.)

1
Paŭlo Ebermann