Linux: Dateien kontinuierlich synchronisieren, eine Möglichkeit

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 verfügt über ssh (und Samba und nfs).

Als Referenz, als ich Dateien unter Windows bearbeitete, kam ich schließlich über WinSCP als genaues Werkzeug, das ich brauchte-WinSCP hat nur diese Funktion vorhanden, mit anfänglicher Synchronisierung und dann kontinuierlicher Aktualisierung, mit dem Dateisystem Watch Service: "Halten Sie Remote-Verzeichnis auf dem neuesten Stand".

Unter Linux könnte man argumentieren, dass sshfs verwendet werden könnte, um die Notwendigkeit der Synchronisierung vollständig zu umgehen. Unter Windows würde eine Samba-Freigabe dasselbe tun. Ich möchte jedoch, dass die IDE mit lokalen Dateien arbeitet (auf einer SSD-Festplatte!), nicht mit zu gehen, die über das Netzwerk zu tun, PHP Indizierung und whatnots, das dauert ewig.

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

, Irgendwelche Ideen oder Hinweise?

Author: stolsvik, 2011-08-01

7 answers

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

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done
 61
Author: Michał Šrajer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-08-01 19:20:00

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

Lsyncd überwacht eine lokale Verzeichnisbaum-Ereignismonitorschnittstelle (inotify oder fsevents). Es aggregiert und kombiniert Ereignisse für einige Sekunden und erzeugt dann einen (oder mehrere) Prozess(e), 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 das lokale Dateisystem nicht behindert Leistung.

Unterm Strich verwendet es die gleichen Tools (inotify und rsync), wie in anderen Antworten vorgeschlagen, aber es ist einfacher, sie für jemanden einzurichten, der mit Shell-Skripten nicht vertraut ist.

 34
Author: jcharaoui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-08-04 19:47:57

Ich brauche das sehr, da mein Code auf Remote-Boxen ausgeführt werden muss und ich Code auf lokalen Computern schreibe. Ich habe ein nettes Tool gefunden, mit dem Sie Ihre lokalen Ordner kontinuierlich überwachen und mit einem Remote-oder lokalen Ordner 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>

Stellen Sie wie bei jedem anderen rsync-Befehl sicher, dass Sie den Ordnerpfad richtig angeben und überprüfen, bevor Sie den Befehl. Ich hatte fast einen meiner Remote-Computer getötet, weil ich verpasst, ein korrektes Zielverzeichnis zu geben. Stellen Sie sicher, dass Sie den Remote-Pfad nicht verpassen und verwenden Sie nicht'/', wenn Sie nicht wissen, was Sie tun.

 32
Author: harry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-02 21:14:25

Wenn Sie das Dateisystem beobachten müssen, ist inotify der richtige Weg. 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 auch die autosync.py für einige Inspiration. Spaß.

 2
Author: Michał Šrajer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-08-01 19:00:53

Was ich einmal getan habe, ist, dass ein Bash-Skript ls -l in einer Schleife (mit etwas Schlaf) ausführt und mit der vorherigen Ausgabe vergleicht. Wenn es sich geändert hat, führen Sie Ihre 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 (nachdem Sie Ihr Synchronisationstool eingegeben haben).

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

 1
Author: PaÅ­lo Ebermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-08-01 18:36:04

Eine Weitere Möglichkeit: https://github.com/mikkorantalainen/rsync-continuous

Dieses Skript verwendet bash, inotifywait und rsync über ssh, um eine sehr schnelle Einwegsynchronisierung zu erstellen, da nur geänderte Dateien übertragen werden müssen und wenn nur ein Teil der Datei geändert wurde, überträgt rsync nur den geänderten Teil.

Wenn Sie mkdir -p ~/.ssh/connections ausführen und am Anfang von ~/.ssh/config Folgendes hinzufügen, ist die Leistung viel besser:

ControlMaster auto
ControlPath   ~/.ssh/connections/%r@%h:%p
ControlPersist 1

Beachten Sie, dass die obige Konfiguration zusätzliche ausgabe für jeden Fall, dass Sie eine SSH-Verbindung aufgrund eines Fehlers beenden https://bugzilla.mindrot.org/show_bug.cgi?id=3220

Wenn Sie eine offene ssh-Verbindung zu dem mit dem obigen Skript verwendeten Remote-Host beibehalten, sollten Dateien mit einer Verzögerung von ungefähr 100 ms synchronisiert werden.

 0
Author: Mikko Rantalainen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-10-09 12:57:40

Viel einfacher Ansatz:

Exportieren Sie Ihre /var/www mit samba (oder nfs) und arbeiten Sie an den Dateien direkt auf dem Server.

Eine andere Lösung: Die meisten IDE erlauben verschiedene Bereitstellungskonfigurationen - überprüfen Sie, ob es eine gibt das passt zu dir.

Oder legen Sie ein Quellcodeverwaltungssystem wie Git, Bazaar usw. fest.

Viel Glück !!

 -1
Author: Dragos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-08-02 10:23:54