lsyncd - sincronização unidirecional, mas para toda a pasta

lsyncd - sincronização unidirecional, mas para toda a pasta

Eu tenho duas pastas ~/Ae ~/B. Com algum conteúdo.

Eu escrevo um lsyncdarquivo 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 lsyncdassim:

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

Observação:O parâmetro -nodemonexiste 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, ~/Ao 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 lsyncddetectasse que ~/Bfalta um arquivo recém-excluído na pasta e sincronizasse as pastas novamente, copiando o arquivo ausente de ~/Apara ~/Bcomo 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. lsyncdusa inotifypara 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 rsyncque se reflitam as mudanças nofonteárvore para oalvo.

Teoricamente, lsyncdpoderia monitorar o alvo inotifytambé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 lsyncdser notificado então sobre um arquivo noalvo remotosendo excluído?

Porém, isso não é um problema: na próxima vez que lsyncdiniciar 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 rsyncexecução. A próxima rsyncexecuçã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 lsyncda sincronização é executada via rsync. Pelo que entendi, há um tempo limite padrão, mas além disso, se lsyncdnotar 1000 (valor padrão) alterações nofontetree (via inotify), então (independentemente do tempo limite) ele é executado rsyncpara sincronizar todos eles de uma vez. Claro, isso é muito melhor do que correr rsyncatrá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 rsyncpara 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 lsyncdmais 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 lsyncdgerados (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.

informação relacionada