lsyncd: sincronización unidireccional pero para toda la carpeta

lsyncd: sincronización unidireccional pero para toda la carpeta

Tengo dos carpetas ~/Ay ~/B. Con algo de contenido.

Escribo un lsyncdarchivo de configuración ~/.config/lsyncd/lsyncd.conf:

# NOTE: Use only absolute path names
# NOTE: check "man rsync" for parameters inside "rsync{}".

# Global settings
settings {
    logfile = "/home/ziga/.config/lsyncd/lsyncd.log",
    statusFile = "/home/ziga/.config/lsyncd/lsyncd-status.log",
    statusInterval = 5
}

# Synchronisation A ⟶ B
sync {
    default.rsync,
    source = "/home/ziga/A",
    target = "/home/ziga/B",
    delete = true,
    rsync = {
        binary = "/usr/bin/rsync",
        executability = true,
        existing = false,
    }
}

Y empiezo lsyncdasí:

lsyncd -nodaemon ~/.config/lsyncd/lsyncd.conf

Nota:El parámetro -nodemonestá ahí solo para brindarme más información en la terminal donde ejecuto el comando anterior.

Inmediatamente después de ejecutar el comando, se realiza la sincronización y el contenido de la carpeta ~/Ase transfiere a la carpeta ~/B. Esto está bien.

De acuerdo con mi archivo de configuración, esperaría que si elimino un archivo en ~/B, no se elimine, ¡ ~/Alo cual también es el caso! Y este es un comportamiento deseado: quiero evitar la eliminación accidental del contenido de la carpeta ~/A.

Pero en este punto también esperaría que lsyncddetecte que a esa carpeta ~/Ble falta un archivo recién eliminado y sincronice las carpetas nuevamente copiando el archivo faltante de ~/Aa ~/Bcomo lo hace inmediatamente cuando se inicia.Pero esto no sucede.

¿Cómo se puede hacer esto?

Respuesta1

En realidad, tiene dos preguntas que probablemente deberían tratarse por separado. Primero echemos un vistazo a la segunda, porque es más fácil de responder:

Pero en este punto también esperaría que lsyncd detecte que a la carpeta ~/B le falta un archivo recién eliminado y sincronizará las carpetas nuevamente copiando el archivo faltante de ~/A a ~/B como lo hace inmediatamente cuando se inicia. !

Con su configuración, no puede esperar una reacción inmediata cuando se elimina un archivo en elobjetivo. lsyncdutiliza inotifypara observar cambios en elfuenteárbol de archivos. En realidad, después de la sincronización inicial que ocurre al arrancar, no sabe qué sucede en elobjetivo. En cambio, de vez en cuando (ver más abajo), llama rsynca reflejar los cambios en lafuenteárbol alobjetivo.

En teoría, también lsyncdse podría monitorear el objetivo a través deinotifysiempre y cuando el objetivo sea local. Pero normalmente este no es el caso. Supongamos que el objetivo está en un host remoto (a diferencia de su ejemplo). ¿Cómo podría lsyncdser notificado entonces sobre un archivo en elobjetivo remotosiendo eliminado?

Sin embargo, esto no es un problema: la próxima vez que lsyncdinicie una nueva sincronización (ejecutando rsync), el archivo se creará nuevamente. Es decir, mientras no hayainmediatoreacción a la eliminación de un archivo en el destino, ese archivo se copiará nuevamente en la siguiente rsyncejecución. La siguiente rsyncejecución ocurre después de una cierta cantidad de cambios en elfuenteárbol (ver más abajo) o al inicio.

Tenga en cuenta que puede configurar la frecuencia con la que lsyncdse ejecuta la sincronización a través de rsync. Hasta donde tengo entendido, hay un tiempo de espera predeterminado, pero además, si lsyncdnota cambios de 1000 (valor predeterminado) en elfuenteárbol (a través de inotify), luego (independientemente del tiempo de espera) se ejecuta rsyncpara sincronizarlos todos a la vez. Por supuesto, esto es mucho mejor que ejecutar rsyncdespués de cada cambio.

Entonces, llegando a su pregunta final ("¿Cómo se puede hacer esto"),no se puede hacer en absoluto, o requiere algo de programación. En todos los casos, tendría que ejecutar un demonio que observe los cambios en el sistema de archivos en elobjetivoy luego se ejecuta por sí solo rsyncpara sincronizar los archivos desde elfuentehaciaobjetivo, o que en caso de tales cambios notifica a otro demonio en elfuenteque a su vez corre rsync.

Pero entonces no necesitarías lsyncdmás, porque con ese conocimiento probablemente construirías tu propio sistema de sincronización bidireccional.

Ahora vayamos a su primer problema:

Según mi archivo de configuración, esperaría que si elimino un archivo en ~/B, no se elimine de ~/A, ¡lo cual también es el caso!

No puedo decir inmediatamente qué está pasando aquí; Realmente no debería suceder dada su configuración. Sin embargo, tengo una sugerencia con respecto a un análisis más detallado:

Al iniciar lsyncd, agregue el parámetro -log Exec. Su línea de comando entonces diría:

lsyncd -log Exec -nodaemon ~/.config/lsyncd/lsyncd.conf

Esto registrará las líneas de comando de todos los procesos lsyncdgenerados (en su caso, en la terminal). Estoy muy seguro de que podremos identificar el problema cuando publique esas líneas de comando (preferiblemente, como una actualización de su pregunta original); Deben mostrar cómo rsyncse ejecuta, incluidos los parámetros de la línea de comando. Quizás pueda ayudar con el análisis, pero para ser honesto, no estoy tan metido en eso rsync.

información relacionada