Tengo dos carpetas ~/A
y ~/B
. Con algo de contenido.
Escribo un lsyncd
archivo 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 lsyncd
así:
lsyncd -nodaemon ~/.config/lsyncd/lsyncd.conf
Nota:El parámetro
-nodemon
está 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 ~/A
se 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, ¡ ~/A
lo 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 lsyncd
detecte que a esa carpeta ~/B
le falta un archivo recién eliminado y sincronice las carpetas nuevamente copiando el archivo faltante de ~/A
a ~/B
como 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. lsyncd
utiliza inotify
para 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 rsync
a reflejar los cambios en lafuenteárbol alobjetivo.
En teoría, también lsyncd
se podría monitorear el objetivo a través deinotify
siempre 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 lsyncd
ser notificado entonces sobre un archivo en elobjetivo remotosiendo eliminado?
Sin embargo, esto no es un problema: la próxima vez que lsyncd
inicie 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 rsync
ejecución. La siguiente rsync
ejecució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 lsyncd
se ejecuta la sincronización a través de rsync
. Hasta donde tengo entendido, hay un tiempo de espera predeterminado, pero además, si lsyncd
nota cambios de 1000 (valor predeterminado) en elfuenteárbol (a través de inotify
), luego (independientemente del tiempo de espera) se ejecuta rsync
para sincronizarlos todos a la vez. Por supuesto, esto es mucho mejor que ejecutar rsync
despué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 rsync
para 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 lsyncd
má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 lsyncd
generados (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 rsync
se 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
.