Eu tenho duas pastas ~/A
e ~/B
. Com algum conteúdo.
Eu escrevo um lsyncd
arquivo de configuração ~/.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,
}
}
E eu começo lsyncd
assim:
lsyncd -nodaemon ~/.config/lsyncd/lsyncd.conf
Nota: O parâmetro
-nodemon
existe apenas para me dar mais informações no terminal onde executo o comando acima.
Imediatamente após a execução do comando, ocorre a sincronização e o conteúdo da pasta ~/A
é transferido para a pasta ~/B
. Esta certo.
De acordo com meu arquivo de configuração, eu esperaria que, se eu excluir um arquivo em ~/B
, ele não será excluído, ~/A
o que também é o caso! E este é um comportamento desejado - eu quero evitar a exclusão acidental de conteúdo na pasta ~/A
.
Mas, neste ponto, eu também esperaria que lsyncd
detectasse que a pasta está faltando um arquivo recém-excluído e sincronize as pastas novamente copiando o ~/B
arquivo ausente como ele faz imediatamente quando é iniciado! Mas isso não acontece.~/A
~/B
Como isso pode ser feito?
Na verdade, você tem duas perguntas que provavelmente devem ser tratadas separadamente. Vamos primeiro dar uma olhada na segunda, porque é mais fácil de responder:
Com sua configuração, você não pode esperar uma reação imediata quando um arquivo é excluído no destino .
lsyncd
usainotify
para observar as alterações na árvore de arquivos de origem . Na verdade, após a sincronização inicial que acontece ao iniciar, ele não sabe o que acontece no destino . Em vez disso, de tempos em tempos (veja abaixo), ele chamarsync
para refletir as alterações na árvore de origem para o destino .Teoricamente,
lsyncd
poderia monitorar o alvo viainotify
, desde que o alvo seja local . Mas geralmente este não é o caso. Vamos supor que o destino esteja em um host remoto (em contraste com seu exemplo). Como poderialsyncd
ser notificado sobre um arquivo no destino remoto sendo excluído?No entanto, isso não é um problema: na próxima vez que
lsyncd
iniciar uma nova sincronização (executandorsync
), o arquivo será criado novamente. Ou seja, embora não haja reação imediata à exclusão de um arquivo no destino, esse arquivo será copiado novamente na próximarsync
execução. A próximarsync
execução acontece após um certo número de alterações na árvore de origem (veja abaixo) ou na inicialização.Observe que você pode configurar a frequência com que
lsyncd
a sincronização é executada viarsync
. Até onde eu entendi, há um tempo limite padrão, mas, além disso, selsyncd
notar 1000 (valor padrão) alterações na árvore de origem (viainotify
), então (independentemente do tempo limite) ele será executadorsync
para sincronizar todos eles de uma vez. Claro, isso é muito melhor do que correrrsync
após cada mudança.Então, chegando à sua pergunta final ("Como isso pode ser feito"), isso não pode ser feito ou requer alguma programação. Em todos os casos, você teria que executar um daemon que observa as alterações do sistema de arquivos no destino e, em seguida, executa sozinho
rsync
para sincronizar os arquivos da origem para o destino ou que, no caso de tais alterações, notifica outro daemon na origem que por sua vez corrersync
.Mas então você não precisaria
lsyncd
mais, porque com esse conhecimento você provavelmente construiria seu próprio sistema de sincronização bidirecional.Agora vamos ao seu primeiro problema:
Não sou capaz de dizer imediatamente o que está acontecendo de errado aqui; isso realmente não deveria acontecer, dada a sua configuração. No entanto, tenho uma sugestão para uma análise mais aprofundada:
Ao iniciar
lsyncd
, adicione o parâmetro-log Exec
. Sua linha de comando então seria:Isso registrará as linhas de comando de todos os processos
lsyncd
gerados (no seu caso, no terminal). Estou muito confiante de que podemos identificar o problema quando você postar essas linhas de comando (de preferência, como uma atualização em sua pergunta original); eles devem mostrar comorsync
é executado, incluindo os parâmetros da linha de comando. Talvez eu possa ajudar com a análise, mas para ser honesto, não sou tão profundorsync
.