86 votes

Linux : Synchroniser les fichiers en continu, d'une seule manière

Scénario : Un IDE est installé sur un poste de travail Linux, pour éditer les fichiers PHP localement. Chaque fois que je sauvegarde un fichier, je veux que ce changement apparaisse sur le serveur linux où Apache tourne. Le serveur possède ssh (ainsi que samba et nfs).

À titre de référence, lorsque j'éditais des fichiers sous Windows, j'ai fini par trouver en WinSCP l'outil exact dont j'avais besoin - WinSCP possède justement cette fonctionnalité, avec une synchronisation initiale puis une mise à jour continue, en utilisant le service de surveillance du système de fichiers : "Keep Remote Directory up to Date".

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

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

Des idées ou des conseils ?

67voto

Michał Šrajer Points 2715

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

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

41voto

Laura Points 1

Lsyncd serait une bonne solution pour cela.

Lsyncd surveille une interface de surveillance des événements des arbres de répertoire locaux (inotify ou fsevents). Il agrège et combine les événements pendant quelques secondes, puis lance un (ou plusieurs) processus pour synchroniser les changements. Par défaut, il s'agit de rsync. Lsyncd est donc une solution légère de miroir vivant qui est relativement facile à installer, ne nécessitant pas de nouveaux systèmes de fichiers ou de périphériques de bloc et n'entravant pas les performances du système de fichiers local.

En résumé, il utilise le même type d'outils pour faire le travail (inotify et rsync) comme suggéré par d'autres réponses, mais il est plus facile à mettre en place pour quelqu'un qui n'est pas familier avec le script Shell.

34voto

harry Points 601

J'en ai beaucoup besoin car mon code doit s'exécuter sur des boîtes distantes et j'écris du code sur la machine locale. J'ai trouvé un outil sympa que vous pouvez utiliser pour surveiller en permanence vos dossiers locaux et les synchroniser avec un dossier local ou distant : https://github.com/axkibe/lsyncd

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

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

Comme avec toute autre commande rsync, assurez-vous de donner le bon chemin d'accès au dossier et vérifiez avant de lancer la commande. J'ai failli tuer une de mes machines distantes parce que j'avais omis de donner un répertoire de destination correct. Assurez-vous de ne pas oublier le chemin distant et n'utilisez pas '/' à moins que vous ne sachiez ce que vous faites.

2voto

Michał Šrajer Points 2715

Si vous avez besoin d'observer le système de fichiers, alors inotify est le moyen de le faire. J'écrirais un simple Python script utilisant pyinotify pour effectuer une synchronisation lorsque le système de fichiers est modifié. Voir documentation . Vous pouvez également consulter le autosync.py pour trouver de l'inspiration. Amusez-vous bien.

1voto

Omkar Points 21

Ce que j'ai fait une fois, c'est d'avoir un bash script en cours d'exécution. ls -l dans une boucle (avec un peu de sommeil) et en comparant avec la sortie précédente. Si elle 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

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X