¿Cómo se activa rsync en la modificación de archivos?

18

Puedo sincronizar carpetas con rsync -avz /directory /target, ahora deseo hacerlo si cambié un archivo, por /directorylo que rsyncdebería llamarse automáticamente.

Estoy usando Virtual Box y la carpeta compartida de Virtual Box es realmente lenta, especialmente si tiene una página web que usa la carpeta compartida como raíz del documento. Con rsyncsería capaz de trabajar con mis archivos locales en la carpeta compartida y sincronizarlos automáticamente con la raíz del documento.

Espero que alguien tenga una idea de cómo hacerlo, crontabno sería bueno, porque se ejecuta cada x minutos, por lo que si no hago nada, seguirá llamando rsyncpero no si modifiqué mi archivo.

Atentamente

BlackScorp
fuente

Respuestas:

18

crontab no sería bueno, porque se ejecuta cada x segundos / minutos, por lo que si no hago nada, seguirá llamando a rsync pero no si modifiqué mi archivo

rsyncsolo sincronizará los archivos que se han cambiado. Si nada ha cambiado, saldrá. Eso es realmente una sobrecarga mínima.

Si no está satisfecho con eso, puede usar inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Eso será más instantáneo pero hará cosas cada vez que guarde.

Oli
fuente
1
bueno, el problema parece ser que inotify no puede verificar las carpetas nfs compartidas. para asegurarme, lo que quiero, tratando de describir, tengo una caja virtual instalada con vagabundo, allí tengo una carpeta compartida "proyectos", está montada en el arranque, todos mis archivos de servidor web se encuentran allí para que pueda modificarlos en mi host sistema (win7), como le dije a la caja virtual, las carpetas compartidas son realmente lentas, por lo que la solución podría ser sincronizar la carpeta nfs montada en otro lugar, por ejemplo / var / www, pero las formas comunes no funcionan, probé cambiar archivos, icrontab, adivinar gamin o fam ayudaría, pero no sé cómo comenzar o usarlos
BlackScorp
@BlackScorp, de manera realista, solo tiene que cronometrar rsync y dejar que decida qué necesita sincronizarse. Como indico en la respuesta, esa no es una muy mala opción.
Oli
1
La otra opción es enviar los archivos desde el host en lugar de intentar detectar cambios de forma remota.
Oli
bueno, esta solución que utilicé antes, tiene 2 problemas: 1) tuve que volver a conectar cada vez a mi caja virtual para editar archivos, lo que significa que mi virtual debe ejecutarse, la edición rápida ya no funciona 2) No sé por qué, pero porque del proceso de escaneo del proyecto de mi samba IDE (Netbeans) muestra un 99% de uso de la CPU y todo dentro de la caja virtual es lento mientras se desarrolla. Probaré la solución rsyn + cronjob o la compilación php en el servidor web
BlackScorp
La inotifywaitsolución tiene un inconveniente leve pero importante: no detecta los cambios que ocurrieron cuando se rsyncestá ejecutando. Considere la siguiente situación: el archivo A ha cambiado; rsync se activa; cuando rsync está casi listo para sincronizar el archivo A, el archivo B cambia. Ahora, rsyncfinaliza y se inotifywaitestá ejecutando, pero el archivo B no está sincronizado y no se sincronizará hasta el próximo cambio. Considere usarlsyncd según lo sugerido por @Arigion.
MarSoft
6

Puede usar Lsyncd (Live Syncing Daemon) :

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 de espejo en vivo liviana que es relativamente fácil de instalar, no requiere nuevos sistemas de archivos o dispositivos de bloque y no obstaculiza el rendimiento del sistema de archivos local.

Aquí hay, por ejemplo, un tutorial para Ubuntu 16.04 .

Arigion
fuente
2

Puedes usar inotifywaity rsync. inotifywaitcon el evento modify,create,deletehabilitado. De esta manera, se sincronizará con su servidor solo cuando el archivo cambie, de lo contrario, se sincronizará cada vez que se lea un archivo (los editores leen varias veces su archivo para verificar si hay algún cambio). Así dijo:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
silgon
fuente
Esto no detectará los cambios ocurridos mientras se ejecuta rsync. Considere usar lsyncdsegún lo sugerido por @Arigion.
MarSoft
esto volverá a aplicar todos los eventos en todos los archivos después de cada cambio ... y cuando se aplique no verá ningún cambio en ese período ...
Alguien
0

Ampliando ligeramente un comentario a la respuesta aceptada He tenido éxito usando fswatch para activar un scparchivo modificado para el invitado. En Linux, esto es un envoltorio, inotifypero también es multiplataforma (estoy en una Mac con un invitado QEMU basado en Arm). También he agregado una sshconstrucción remota. El enfoque push funciona bien con recursos compartidos que se comportan de manera menos que ideal.

Robin Macharg
fuente