
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 inotifywait
desde 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 -l
en 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).