
Szenario: Auf einem Linux-Desktop-Rechner ist eine IDE eingerichtet, die PHP-Dateien lokal bearbeitet. Jedes Mal, wenn ich eine Datei speichere, soll diese Änderung auf dem Linux-Server angezeigt werden, auf dem Apache läuft. Der Server verfügt über SSH (und Samba und NFS).
Zur Information: Als ich Dateien unter Windows bearbeitete, stieß ich schließlich auf WinSCP als genau das Tool, das ich brauchte. WinSCP verfügt über genau diese Funktion mit anfänglicher Synchronisierung und anschließender kontinuierlicher Aktualisierung unter Verwendung des Dateisystem-Überwachungsdienstes: „Remote-Verzeichnis auf dem neuesten Stand halten“.
Unter Linux könnte man argumentieren, dass man mit SSHFS die Notwendigkeit der Synchronisierung vollständig umgehen könnte. Unter Windows würde eine Samba-Freigabe das Gleiche tun. Ich möchte jedoch, dass die IDE mit lokalen Dateien (auf einer SSD-Festplatte!) arbeitet und nicht über das Netzwerk PHP-Indizierung und dergleichen durchführen muss, was ewig dauert.
Aber SSHFS könnte dennoch ein Teil der Lösung sein, sodass die kontinuierliche Synchronisierung nur zwischen zwei lokalen Verzeichnissen erfolgen muss.
Irgendwelche Ideen oder Hinweise?
Antwort1
Sie können es 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
Antwort2
Lsyncdwäre hierfür eine gute Lösung.
Lsyncd überwacht die Ereignisüberwachungsschnittstelle eines lokalen Verzeichnisbaums (inotify oder fsevents). Es aggregiert und kombiniert Ereignisse für einige Sekunden und startet dann einen (oder mehrere) Prozess(e), um die Änderungen zu synchronisieren. Standardmäßig ist dies rsync. Lsyncd ist daher eine leichtgewichtige Live-Mirror-Lösung, die vergleichsweise einfach zu installieren ist, keine neuen Dateisysteme oder Blockgeräte erfordert und die Leistung des lokalen Dateisystems nicht beeinträchtigt.
Unterm Strich werden für die Aufgabe dieselben Tools (inotify und rsync) verwendet wie in anderen Antworten vorgeschlagen, aber die Einrichtung ist für jemanden, der mit Shell-Skripting nicht vertraut ist, einfacher.
Antwort3
Ich brauche das sehr oft, da mein Code auf Remote-Rechnern laufen muss und ich Code auf dem lokalen Rechner schreibe. Ich habe ein nettes Tool gefunden, mit dem Sie Ihre lokalen Ordner kontinuierlich ü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>
Stellen Sie wie bei jedem anderen rsync-Befehl sicher, dass Sie den Ordnerpfad richtig angeben und überprüfen Sie ihn, bevor Sie den Befehl ausführen. Ich hätte beinahe einen meiner Remote-Rechner zerstört, weil ich vergessen hatte, ein korrektes Zielverzeichnis anzugeben. Stellen Sie sicher, dass Sie den Remote-Pfad nicht vergessen und verwenden Sie kein „/“, es sei denn, Sie wissen, was Sie tun.
Antwort4
Ich habe einmal ein Bash-Skript ls -l
in einer Schleife laufen lassen (mit etwas Ruhepause) und es mit der vorherigen Ausgabe verglichen. 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 Argumenten (nachdem Sie Ihr Synchronisierungstool eingefügt haben).
(Ich habe dies verwendet, um eine Kompilierung zu starten, nicht um zu synchronisieren, aber dies würde ähnlich funktionieren.)