Linux: sincronice archivos continuamente, de una manera

61

Escenario: un IDE se configura en una caja de escritorio de Linux, editando archivos PHP localmente. Cada vez que guardo un archivo, quiero que este cambio aparezca en el servidor Linux donde se está ejecutando Apache. El servidor tiene ssh (y samba y nfs para el caso).

Como referencia, cuando edité archivos en Windows, finalmente encontré WinSCP como la herramienta exacta que necesitaba: WinSCP tiene esta característica presente, con sincronización inicial y luego actualización continua, usando el servicio de observación del sistema de archivos: "Mantenga el Directorio Remoto actualizado Fecha".

En Linux, se podría argumentar que sshfs podría emplearse para evitar por completo la necesidad de sincronización. En Windows, un samba-share haría lo mismo. Sin embargo, quiero que el IDE funcione con archivos locales (¡en un disco SSD!), Sin tener que pasar por la red para indexar PHP y demás, lo que lleva años.

Sin embargo, sshfs podría ser parte de la solución, de modo que la sincronización continua solo debía hacerse entre dos directorios locales.

¿Alguna idea o puntero?

Stolsvik
fuente
considere usar la herramienta rsync o compartir una carpeta en la raíz de documentos del servidor web para poder operar en los archivos directamente debajo de Windows
Vinicius Kamakura
2
rsync es "one go". Necesito actualizaciones continuas, ese es el punto principal aquí: edito un archivo, lo guardo, y el producto / sistema / idea que solicito recogería esta acción de guardar y subiría la nueva versión de inmediato. NB: Ambas partes son Linux. NB2: Quiero editar en archivos locales, o de lo contrario sshfs lo cortaría.
stolsvik
66
Votantes fuera del tema, este es un caso límite, pero creo que se encuentra bastante claramente en "herramientas comúnmente utilizadas por los programadores" en las preguntas frecuentes.
Karl Bielefeldt
Si bien no es una combinación perfecta, puede mirar overlayfs
phs

Respuestas:

57

También puede usarlo inotifywaitdesde el paquete inotify-tools.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done
Michał Šrajer
fuente
13
En el sitio web inotify-tools , hay un buen ejemplo de uso de inotify-wait para activar un rsync.
Karl Bielefeldt
¡Estaba buscando esto exactamente anoche! ahhh me encanta superusuario
CenterOrbit 01 de
¿Hay alguna manera de hacer esto pero manteniendo el zócalo abierto? rsync/ scptiene un retraso molesto al establecer la conexión ssh.
Flash
1
@ Flash sí, puede usar la multiplexación SSH para mantener el socket abierto.
Will Angley
31

Lsyncd sería una buena solución para esto.

Lsyncd observa una interfaz de monitor de eventos de árboles de directorio local (inotify o fsevents). Agrega y combina eventos durante unos segundos y luego genera uno (o más) proceso (s) para sincronizar los cambios. Por defecto esto es rsync. Lsyncd es, por lo tanto, una solución liviana de espejo en vivo que es relativamente fácil de instalar, no requiere nuevos sistemas de archivos o dispositivos de bloqueo y no obstaculiza el rendimiento del sistema de archivos local.

En pocas palabras, utiliza el mismo tipo de herramientas para hacer el trabajo (inotify y rsync) como lo sugieren otras respuestas, pero es más fácil de configurar para alguien que no esté familiarizado con los scripts de shell.

jcharaoui
fuente
no solo es más fácil, también trata de manejar situaciones como mover el directorio correctamente, sin rsyncing.
Ciantic
55
Cuidado: este programa tiene algunas características problemáticas. Al escribir esto: 1. Elimina los archivos remotos que no están presentes en la fuente por defecto. 2. "remoto:" se refiere a "remoto: /" en lugar de la carpeta de inicio. 3. Daemoniza, por lo que no sabes lo que está pasando. 4. No respeta inmediatamente la señal TERM.
Friedrich
27

Necesito esto mucho ya que mi código debe ejecutarse en cajas remotas y escribo código en la máquina local. Encontré una buena herramienta que puede usar para monitorear continuamente sus carpetas locales y sincronizarlas con la carpeta remota o local: https://github.com/axkibe/lsyncd

Un comando simple para sincronizar continuamente un directorio local con una máquina remota a través de ssh será:

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

Al igual que con cualquier otro comando rsync, asegúrese de dar la ruta correcta a la carpeta y verifique antes de ejecutar el comando. Casi había matado una de mis máquinas remotas porque no pude dar un directorio de destino correcto. Asegúrese de no perderse la ruta remota y no use '/' a menos que sepa lo que está haciendo.

acosar
fuente
Esto merece muchos más votos a favor, incluso tres años después de que se haya publicado
FliiFe
Funciona muy bien, finalmente lo hice funcionar en mi Mac OS Sierra, funciona de maravilla.
Erik van de Ven
2

Si necesita observar el sistema de archivos, entonces inotify es la forma de hacerlo. Escribiría una secuencia de comandos simple de python usando pyinotify para realizar la sincronización cuando se cambie el sistema de archivos. Ver documentación . También puede consultar autosync.py para obtener algo de inspiración. Que te diviertas.

Michał Šrajer
fuente
1

Lo que hice una vez es tener un script bash ejecutándose ls -len un bucle (con algo de suspensión) y comparándolo con el resultado anterior. Si cambió, realice su sincronización.

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

Inicie este script en una nueva terminal con los nombres de archivo como argumentos (después de poner en su herramienta de sincronización).

(Usé esto para comenzar una compilación, no para sincronizar, pero funcionaría de manera similar).

Paŭlo Ebermann
fuente
-1

Enfoque mucho más simple:

Exporte su / var / www con samba (o nfs) y trabaje en los archivos directamente en el servidor.

Otra solución: la mayoría de los IDE permiten varias configuraciones de implementación: compruebe si hay una que le convenga.

O configure un sistema de gestión del código fuente como Git, Bazaar, etc.

Buena suerte !!

Dragos
fuente
3
Gracias por responder. Sin embargo, excluí específicamente este enfoque en la pregunta.
stolsvik