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


61

Scénario: Un environnement de développement intégré 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 une synchronisation initiale puis une mise à jour continue, à l’aide du service de surveillance du système de fichiers: Date".

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 l'EDI fonctionne avec des fichiers locaux (sur un disque SSD!), Sans avoir à passer par le réseau pour indexer PHP et autres, ce qui prend beaucoup de 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?


Pensez à utiliser l'outil rsync ou à partager un dossier dans la racine du document du serveur Web pour pouvoir utiliser les fichiers directement sous Windows
Vinicius Kamakura

2
rsync est "one go". Il me faut des mises à jour continues, c’est l’essentiel ici: je modifie un fichier, le sauvegarde, et le produit / système / idée que je demande prend en charge cette opération de sauvegarde et télécharge immédiatement la nouvelle version. NB: Les deux côtés sont Linux. NB2: Je veux éditer sur des fichiers locaux, sinon sshfs le couperait lui-même.
Stolsvik

6
Électeurs hors-sujet, il s'agit d'un cas limite, mais je pense que cela relève assez clairement des "outils couramment utilisés par les programmeurs" dans la FAQ.
Karl Bielefeldt

Bien que ce ne soit pas un match parfait, vous pouvez regarder des superpositions
phs

Réponses:


57

Vous pouvez également utiliser inotifywaitle package inotify-tools.

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

13
Sur le site Web inotify-tools , il y a un très bon exemple d'utilisation d'inotify-wait pour déclencher un rsync.
Karl Bielefeldt

Je cherchais cette chose exacte la nuit dernière! ahhh I love superuser
CenterOrbit

Y a-t-il un moyen de faire cela tout en gardant la prise ouverte? rsync/ scpa un retard gênant lors de l’établissement de la connexion ssh.
Flash

1
@ Flash Oui, vous pouvez utiliser le multiplexage SSH pour garder le socket ouvert.
Will Angley

31

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 agrège 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 ou 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 pour effectuer le travail (inotify et rsync) que celui suggéré par d’autres réponses, mais il est plus facile à configurer pour ceux qui ne sont pas familiarisés avec les scripts shell.


non seulement plus facile, il essaie également de gérer des situations telles que le déplacement correct du répertoire, sans effectuer de synchronisation.
Ciantic

5
Attention: ce programme a quelques fonctionnalités problématiques. Au moment de l'écriture de ceci: 1. Il supprime par défaut les fichiers distants non présents à la source. 2. "remote:" se réfère à "remote: /" au lieu du dossier personnel. 3. Cela démonise, donc vous ne savez pas ce qui se passe. 4. Il ne respecte pas immédiatement le signal TERM.
Friedrich

27

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 bon outil que vous pouvez utiliser pour surveiller en permanence vos dossiers locaux et les synchroniser avec 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 n'avais pas réussi à 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.


Cela mérite bien plus de votes positifs, même trois ans après sa
publication

Fonctionne très bien, fonctionne enfin sur mon Mac OS Sierra, fonctionne à merveille.
Erik van de Ven

2

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 fichier autosync.py pour vous inspirer. S'amuser.


1

Ce que j’ai fait une fois, c’est qu’un script bash s’exécute ls -len 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

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 autorisent différentes configurations de déploiement - vérifiez s’il en existe une qui vous convient.

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

Bonne chance !!


3
Merci de répondre. Cependant, j’ai spécifiquement exclu cette approche dans la question.
Stolsvik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.