Linux: synchronise continuellement les fichiers, d'une manière

Scénario: Un IDE est configuré sur une boîte de travail Linux, en éditant les fichiers PHP localement. Chaque fois que je sauvegarde un fichier, je souhaite que cette modification apparaisse sur le serveur linux où Apache est en cours d'exécution. Le serveur a ssh (et samba et nfs pour cette question).

Comme référence, lorsque j'ai édité des fichiers sur Windows, je suis finalement venu sur WinSCP comme l'outil exact dont j'ai besoin – WinSCP ont juste cette fonctionnalité présente, avec la synchronisation initiale et la mise à jour continue, en utilisant le service de surveillance du système de fichiers: "Keep Remote Directory jusqu'à Rendez-vous amoureux".

Sur Linux, on pourrait soutenir que sshfs pourrait être utilisé pour contourner entièrement le besoin de synchronisation. Sur Windows, une samba-share ferait de même. Cependant, je veux que l'IDE fonctionne avec des fichiers locaux (sur un disque SSD!), Ne pas avoir à parcourir le réseau pour faire l'indexation PHP et whatnots, qui prend des années.

Mais sshfs pourrait être une partie de la solution néanmoins – de sorte que la synchronisation continue devait être effectuée entre deux répertoires locaux.

Des idées ou des astuces?

Vous pouvez également utiliser inotifywait dans le package inotify-tools.

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

Lsyncd serait une bonne solution pour cela.

Lsyncd regarde une interface de suivi d'événements d'arbres de répertoires locaux (inotify ou fsevents). Il agrège et combine les événements pendant quelques secondes, puis génère un (ou plusieurs) processus (s) pour synchroniser les modifications. Par défaut, c'est rsync. Lsyncd est donc une solution miroir en direct légère qui est relativement facile à installer ne nécessitant pas de nouveaux systèmes de fichiers ou de blocs et n'empêche pas les performances du système de fichiers local.

En bout de ligne, il utilise le même type d'outils pour effectuer le travail (inotify et rsync) comme suggéré par d'autres réponses, mais il est plus facile de configurer pour quelqu'un qui n'est pas familier avec les scripts shell.

J'ai beaucoup besoin car mon code doit fonctionner sur des boîtes à distance et j'écris un code sur une machine locale. J'ai trouvé un bon outil que vous pouvez utiliser pour surveiller en permanence vos dossiers locaux et les synchroniser avec le dossier distant ou local: https://github.com/axkibe/lsyncd

Une simple commande pour synchroniser en permanence un dir local avec une machine distante sur ssh sera:

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

Tout comme avec toute autre commande rsync, assurez-vous de donner le chemin du dossier à droite et vérifiez avant d'exécuter la commande. J'avais presque tué une de mes machines distantes parce que je manquais pour donner un répertoire de destination correct. Assurez-vous de ne pas manquer le chemin d'accès à distance et n'utilisez pas '/' sauf si vous savez ce que vous faites.

Si vous devez observer le système de fichiers, alors inotify est la façon de le faire. J'écrivais un script python simple en utilisant pyinotify pour effectuer une synchronisation lorsque le système de fichiers est modifié. Voir la documentation . Vous pouvez également consulter l' autosync.py pour obtenir de l'inspiration. S'amuser.

Ce que j'ai fait une fois, j'ai un script bash exécutant ls -l en boucle (avec un peu de sommeil) et comparé à la sortie précédente. Si cela change, effectuez votre synchronisation.

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

Démarrez ce script dans un nouveau terminal avec les noms de fichiers comme arguments (après avoir mis votre outil de synchronisation).

(J'ai utilisé cela pour commencer une compilation, pour ne pas synchroniser, mais cela fonctionnerait d'une manière similaire).

Approche beaucoup plus simple:

Exportez votre / var / www avec samba (ou nfs) et travaillez sur les fichiers directement sur le serveur.

Une autre solution: la plupart des IDE permettent une configuration de déploiement variée – vérifiez si cela vous convient.

Ou définir un système de gestion de code source comme Git, Bazaar, etc.

Bonne chance !!