Obtendo uma lista simples de arquivos alterados do uníssono

1

Eu tenho um sistema de arquivos que é alterado em dois servidores e também precisa ser replicado para o Amazon S3.

Até recentemente, a sincronização do sistema de arquivos entre os dois servidores usando o Unison, e depois copiar para o S3 com o s3sync.rb era uma ótima solução.

Agora que o sistema de arquivos é de quase 50GB, o s3sync.rb tornou-se o gargalo, já que ele precisa verificar se há frescor em cada arquivo (usamos o sinalizador -no-md5).

Agora eu tenho um script que espera uma lista de arquivos, e ele atualizaria esses e somente estes usando s3cmd.rb

Eu esperava poder usar o arquivo unison.log para obter uma lista canônica de arquivos a serem transmitidos, mas o formato dele varia dependendo da operação que ocorreu em um arquivo (novo arquivo, cópia da alternativa local, renomear etc).

O unison é capaz de gerar um log ou lista de arquivos que foram alterados diferente do que foi deixado em unison.log?

No momento, é como estou extraindo a lista de arquivos do unison.log (estou ignorando deliberadamente as exclusões)

# Ignore deletes and get the list of new & changed files
grep -v '\[END\] Deleting ' /tmp/unison.log | grep '\[END\]' $unisonlog | sed -re 's/\[END\] (Copying|Updating file) //' > /tmp/changed-files.log

# Files that unison lists as shortcuts are harder as it doesn't always prefix them with their full path
# so before adding them to the log, find the files in the relevant directory
grep 'Shortcut: copying ' /tmp/unison.log | sed -re 's/Shortcut: copying (.*)+ from local file.*//' | while read file
do
  echo "Having to look for $file in source directory"
  find /ebs/src -wholename "*$file" >> /tmp/changed-files.log
done
    
por jaygooby 27.02.2013 / 14:37

1 resposta

2

Uma ideia seria usar o stdout gerado pelo Unison enquanto ele estiver em execução. Existe algum lixo em stdout que o Unison usa para criar um efeito dinâmico no terminal enquanto ele está "procurando por mudanças". Este lixo eletrônico pode ser removido facilmente excluindo cada linha contendo um caractere Carriage Return (CR) (no vim isso seria algo como :%s/^.*^M.*$\n//g onde ^M é digitado pressionando Crtl + V então Crtl + M ). O resultado parece algo como

         <---- new dir    bar/foo/newdir   
deleted  ---->            bar/user/oldfile1  
deleted  ---->            bar/user/oldfile2  
         <---- new file   foobar/test/quiz.txt
         <---- changed    foobar/test/quiz.txt

Isso é muito mais facilmente analisado do que o log padrão do Unison.

Uma idéia melhor é esquecer a análise da saída do Unison e usar inotifywait . Você pode configurar inotifywait para assistir a um determinado diretório e relatar quaisquer arquivos que foram alterados, movidos, criados, etc.

inotifywait --event modify,attrib,move,create,delete  \
            --daemon                                  \
            --outfile /path/to/output.log             \
            --recursive                               \
            --quiet                                   \
            --format %w%f                             \
            '/watch/directory/'                   

Isso executará inotifywait como um daemon e produzirá uma lista muito agradável e continuamente atualizada ( output.log ) dos caminhos absolutos de todos os arquivos em /watch/directory/ nos quais um dos eventos especificados ocorreu. Você provavelmente precisará alterar os eventos fornecidos e / ou utilizar a opção --exclude para obter exatamente a lista de arquivos que deseja sincronizar com o S3.

    
por 23.04.2015 / 03:11