Linux: sincroniza archivos continuamente, de una manera

Linux: sincroniza archivos continuamente, de una manera

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

Como referencia, cuando edité archivos en Windows, finalmente encontré WinSCP como la herramienta exacta que necesitaba: WinSCP tiene solo esta característica presente, con sincronización inicial y luego actualización continua, usando el servicio de vigilancia del sistema de archivos: "Mantener 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 recurso compartido de samba haría lo mismo. Sin embargo, quiero que el IDE funcione con archivos locales (¡en un disco SSD!), sin tener que conectarse a la red para realizar la indexación de PHP y demás, lo que lleva mucho tiempo.

Pero sshfs podría ser parte de la solución de todos modos, por lo que la sincronización continua solo necesitaba realizarse entre dos directorios locales.

¿Alguna idea o sugerencia?

Respuesta1

También puede utilizarlo 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

Respuesta2

LsyncdSería una buena solución para esto.

Lsyncd observa una interfaz de monitoreo de eventos de árboles de directorio local (inotify o fsevents). Agrega y combina eventos durante unos segundos y luego genera uno (o más) procesos para sincronizar los cambios. Por defecto esto es rsync. Lsyncd es, por lo tanto, una solución de espejo en vivo liviana que es comparativamente 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.

Respuesta3

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 puedes usar para monitorear continuamente tus carpetas locales y sincronizarlas con una carpeta local o remota: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 indicar correctamente la ruta de la carpeta y verifíquela antes de ejecutar el comando. Casi había matado una de mis máquinas remotas porque no pude proporcionar un directorio de destino correcto. Asegúrese de no perderse la ruta remota y no utilice '/' a menos que sepa lo que está haciendo.

Respuesta4

Lo que hice una vez fue ejecutar un script bash ls -len un bucle (con algo de suspensión) y compararlo con el resultado anterior. Si cambió, haz tu 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 los archivos como argumentos (después de instalar su herramienta de sincronización).

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

información relacionada