web-dev-qa-db-fra.com

Linux: synchroniser les fichiers en continu, une manière

Scénario: Un IDE est configuré sur un ordinateur de bureau Linux, modifiant les fichiers PHP localement. Chaque fois que j'enregistre un fichier, je souhaite que cette modification apparaisse sur le serveur Linux sur lequel Apache est exécuté. Le serveur a ssh (et samba et nfs d'ailleurs).

En guise de référence, lorsque j’ai édité des fichiers sous Windows, j’ai finalement adopté WinSCP comme étant l’outil exact dont j'avais besoin - WinSCP ne présente que cette fonctionnalité, avec synchronisation initiale puis mise à jour continue, à l’aide du service de surveillance du système de fichiers: Rendez-vous amoureux".

Sous Linux, on pourrait argumenter que sshfs pourrait être utilisé pour éviter complètement le besoin de synchronisation. Sous Windows, un partage Samba ferait de même. Cependant, je veux que IDE fonctionne avec des fichiers locaux (sur un disque SSD!), Sans avoir à passer par le réseau pour effectuer PHP indexation et autres, ce qui prend du temps.

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

Des idées ou des pointeurs?

58
stolsvik

Vous pouvez également utiliser inotifywait à partir du paquet inotify-tools.

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

Lsyncd serait une bonne solution pour cela.

Lsyncd surveille une interface de moniteur d'événements d'arbres de répertoires locaux (inotify ou fsevents). Il regroupe et combine les événements pendant quelques secondes, puis génère un (ou plusieurs) processus pour synchroniser les modifications. Par défaut c'est rsync. Lsyncd est donc une solution Live Mirror légère, relativement facile à installer, qui ne nécessite pas de nouveaux systèmes de fichiers ni de blocs périphériques, et qui n’entrave pas les performances du système de fichiers local.

En bout de ligne, il utilise le même type d’outils (inotify et rsync) que celui suggéré par d’autres réponses, mais il est plus facile à configurer pour une personne non familiarisée avec les scripts Shell.

31
jcharaoui

J'ai beaucoup besoin de cela car mon code doit fonctionner sur des boîtes distantes et j'écris du code sur une machine locale. J'ai trouvé un outil de Nice qui vous permet de surveiller en permanence vos dossiers locaux et de les synchroniser vers un dossier distant ou local: https://github.com/axkibe/lsyncd

Une commande simple pour synchroniser en continu un répertoire local avec une machine distante via ssh sera:

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

Comme pour toute autre commande rsync, assurez-vous de bien définir le chemin du dossier et vérifiez avant d'exécuter la commande. J'avais presque tué l'un de mes ordinateurs distants parce que je manquais pour donner un répertoire de destination correct. Assurez-vous de ne pas manquer le chemin distant et n'utilisez pas '/' sauf si vous savez ce que vous faites.

25
harry

Si vous devez observer le système de fichiers, alors inotify est le moyen de le faire. J'écrirais un script python simple en utilisant pyinotify pour effectuer la synchronisation lorsque le système de fichiers est modifié. Voir la documentation . Vous pouvez également consulter le autosync.py pour vous inspirer. S'amuser.

2
Michał Šrajer

Ce que j’ai fait jadis, c’est que le script bash exécute ls -l dans une boucle (avec un peu de sommeil) et se compare au résultat précédent. Si cela a changé, faites 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).

(Je l'ai utilisé pour démarrer une compilation, pas pour synchroniser, mais cela fonctionnerait de la même manière.)

1
Paŭlo Ebermann