Como aciono o rsync na modificação de arquivos?

18

Eu posso sincronizar pastas com rsync -avz /directory /target, agora eu desejo fazê-lo se eu alterei um arquivo /directorypara rsyncque ele seja chamado automaticamente.

Estou usando o Virtual Box e a pasta compartilhada do Virtual Box é muito lenta, especialmente se você tiver uma página da Web que esteja usando a pasta compartilhada como raiz do documento. Com rsynceu seria capaz de trabalhar com meus arquivos locais na pasta compartilhada e sincronizá-lo automaticamente com a raiz do documento.

Espero que alguém tenha uma idéia de como fazê-lo, crontabnão seria bom, porque é executado a cada x minutos, por isso, se eu não fizer nada, ele ainda será chamado, rsyncmas não se eu modificar meu arquivo.

Cumprimentos

BlackScorp
fonte

Respostas:

18

O crontab não seria bom, porque é executado a cada x segundos / minutos; portanto, se eu não fizer nada, ele ainda chamará rsync, mas não se eu modificar o meu arquivo

rsyncsincronizará apenas os arquivos que foram alterados. Se nada mudou, ele sairá. Isso é realmente uma sobrecarga mínima.

Se você não estiver satisfeito com isso, poderá usar inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Isso será mais instantâneo, mas fará as coisas toda vez que você salvar.

Oli
fonte
11
bem, o problema parece que o inotify não é capaz de verificar pastas compartilhadas do nfs. para ter certeza, o que eu quero, tentando descrever, eu tenho a caixa virtual instalada com o vagrant, lá tenho uma pasta compartilhada "projetos" que é montada na inicialização, todos os meus arquivos do servidor web estão localizados lá para que eu possa modificá-los no meu host sistema (win7), como eu disse, as pastas compartilhadas da caixa virtual são muito lentas, então a solução pode ser sincronizar a pasta nfs montada em outro local, por exemplo, / var / www, mas as formas comuns não estão funcionando, tentei mudar de arquivo, icrontab, gues gamin ou fam ajudaria, mas eu não sei como iniciá-los ou usá-los
#
@BlackScorp realisticamente, você fica preso apenas ao sincronizar o rsync e deixá-lo decidir o que precisa ser sincronizado. Como lidero na resposta, essa não é uma péssima opção.
Oli
11
A outra opção é enviar os arquivos do host por push, em vez de tentar detectar alterações remotamente.
Oli
bem, essa solução que eu usei antes, tem 2 problemas: 1) eu tive que me reconectar toda vez à minha caixa virtual para editar arquivos, o que significa que meu virtual deve estar em execução, a edição rápida não está mais funcionando 2) eu não sei por que, mas porque do processo de digitalização projeto do meu IDE (Netbeans) shows de samba 99% de uso de CPU e tudo dentro da caixa virtual é apenas lento durante o desenvolvimento vou tentar a + solução RSYN cronjob ou a construção php no servidor web
BlackScorp
A inotifywaitsolução tem uma desvantagem leve, mas importante: não detecta alterações que ocorreram quando rsyncestá em execução. Considere a seguinte situação: o arquivo A foi alterado; rsync é acionado; quando o rsync está quase terminando de sincronizar o arquivo A, o arquivo B é alterado. Agora, rsyncterminou e inotifywaitestá em execução, mas o arquivo B não está sincronizado e não será sincronizado até alguma próxima alteração. Considere usarlsyncd como sugerido por @Arigion.
MarSoft 25/07
6

Você pode usar o Lsyncd (Live Syncing Daemon) :

O Lsyncd observa uma interface do monitor de eventos das árvores de diretórios locais (inotify ou fsevents). Ele agrega e combina eventos por alguns segundos e gera um (ou mais) processo (s) para sincronizar as alterações. Por padrão, isso é rsync. O Lsyncd é, portanto, uma solução leve de espelho ao vivo que é comparativamente fácil de instalar, sem exigir novos sistemas de arquivos ou dispositivos de bloqueio e não prejudica o desempenho do sistema de arquivos local.

Aqui está, por exemplo, um tutorial para o Ubuntu 16.04 .

Arigion
fonte
2

Você pode usar inotifywaite rsync. inotifywaitcom o evento modify,create,deleteativado. Dessa forma, você sincronizará com o servidor apenas quando o arquivo for alterado, caso contrário, ele será sincronizado sempre que um arquivo for lido (os editores leem várias vezes o arquivo para verificar se há alguma alteração). Assim disse:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
silgon
fonte
Isso não detectará alterações ocorridas enquanto o rsync estiver em execução. Considere usar lsyncdcomo sugerido por @Arigion.
MarSoft
isso reaplicará todos os eventos em todos os arquivos após cada alteração ... e quando estiver aplicando, não verá nenhuma alteração nesse período ...
Alguém
0

Expandindo levemente um comentário para a resposta aceita, tive sucesso usando o fswatch para acionar um scpdos arquivos alterados para o convidado. No Linux, esse é um invólucro, inotifymas também é multiplataforma (estou em um Mac com um convidado QEMU baseado em Arm). Também aderi a uma sshconstrução remota. A abordagem push funciona bem com compartilhamentos que se comportam de maneiras menos do que ideais.

Robin Macharg
fonte