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
Observação:O parâmetro
-nodemon
existe apenas para me fornecer mais informações no terminal onde executo o comando acima.
Imediatamente após a execução do comando, a sincronização ocorre 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 ~/B
, ele não seja excluído, ~/A
o que também é o caso! E este é um comportamento desejado - quero evitar a exclusão acidental de conteúdo em folder ~/A
.
Mas neste ponto eu também esperaria que lsyncd
detectasse que ~/B
falta um arquivo recém-excluído na pasta e sincronizasse as pastas novamente, copiando o arquivo ausente de ~/A
para ~/B
como acontece imediatamente quando é iniciado!Mas isso não acontece.
Como isso pode ser feito?
Responder1
Na verdade, você tem duas questões que provavelmente deveriam ser tratadas separadamente. Vamos primeiro dar uma olhada na segunda, porque é mais fácil de responder:
Mas neste ponto eu também esperaria que o lsyncd detectasse que a pasta ~/B está faltando um arquivo recém-excluído e sincronizará as pastas novamente copiando o arquivo ausente de ~/A para ~/B como faz imediatamente quando é iniciado !
Com sua configuração, você não pode esperar uma reação imediata quando um arquivo for excluído no momento.alvo. lsyncd
usa inotify
para observar mudanças nofonteárvore de arquivos. Na verdade, após a sincronização inicial que acontece na partida, ele não sabe o que acontece noalvo. Em vez disso, de tempos em tempos (veja abaixo), exige rsync
que se reflitam as mudanças nofonteárvore para oalvo.
Teoricamente, lsyncd
poderia monitorar o alvo inotify
também atravésdesde 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 o seu exemplo). Como poderia lsyncd
ser notificado então sobre um arquivo noalvo remotosendo excluído?
Porém, isso não é um problema: na próxima vez que lsyncd
iniciar uma nova sincronização (executando rsync
), o arquivo será criado novamente. Ou seja, enquanto não houverimediatoreação a um arquivo sendo excluído no destino, esse arquivo será copiado novamente na próxima rsync
execução. A próxima rsync
execução acontece após um certo número de alterações nofonteárvore (veja abaixo) ou na inicialização.
Observe que você pode configurar a frequência com que lsyncd
a sincronização é executada via rsync
. Pelo que entendi, há um tempo limite padrão, mas além disso, se lsyncd
notar 1000 (valor padrão) alterações nofontetree (via inotify
), então (independentemente do tempo limite) ele é executado rsync
para sincronizar todos eles de uma vez. Claro, isso é muito melhor do que correr rsync
atrás de cada mudança.
Então, chegando à sua pergunta final (“Como isso pode ser feito”),isso não pode ser feito de jeito nenhum, ou requer alguma programação. Em todos os casos, você teria que executar um daemon que monitorasse as alterações do sistema de arquivos noalvoe então executa sozinho rsync
para sincronizar os arquivos dofontepara oalvo, ou que, no caso de tais alterações, notifica outro daemon nofonteque por sua vez é executado rsync
.
Mas então você não precisaria de lsyncd
mais nada, porque com esse conhecimento você provavelmente construiria seu próprio sistema de sincronização bidirecional.
Agora vamos ao seu primeiro problema:
De acordo com meu arquivo de configuração, eu esperaria que, se eu excluir um arquivo em ~/B, ele não seja excluído de ~/A, o que também é o caso!
Não sou capaz de dizer imediatamente o que está 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 seria:
lsyncd -log Exec -nodaemon ~/.config/lsyncd/lsyncd.conf
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 na sua pergunta original); eles devem mostrar como rsync
é executado, incluindo os parâmetros da linha de comando. Talvez eu possa ajudar com a análise, mas, para ser sincero, não estou tão envolvido rsync
.