rsync faz 2 backups se o cron for executado enquanto o arquivo estiver sendo gravado

2

Eu tenho um crontab para executar este comando rsync a cada 30m

rsync -rtbpgoi --suffix="."$(date +"%Y%m%d%H%M") --exclude=".*" \
--exclude="~*" --exclude="[Tt][Hh][Uu][Mm][Bb][Ss].[Dd][Bb]" \
--exclude="[Dd][Ee][Ss][Kk][Tt][Oo][Pp].[Ii][Nn][Ii]" \
--info=STATS0,FLIST0,NAME1 /mnt/datastore/ /mnt/dsbackup

O que acontece é que, se um arquivo estiver sendo escrito, como um download longo, por exemplo, acabo com uma cópia de backup extra do arquivo, sendo um backup do download incompleto.

Existe alguma maneira de fazer com que rsync ignore arquivos que ainda estão sendo gravados ou de alguma outra maneira para evitar o backup de arquivos incompletos? Eu sei que posso remover as opções -b e --suffix , mas quero manter a funcionalidade de manter um histórico de versão quando os arquivos são alterados.

    
por Geo R 22.01.2017 / 19:27

1 resposta

0

Para responder à sua pergunta : rsync , de acordo com o meu conhecimento, não tem alguma forma incorporada de saber que algum programa separado que você está executando ( navegador da Web, etc.) está modificando ativamente um arquivo.

Dado seu tipo de backup (executando sobre a mesma origem e destino a cada 30 minutos), você pode obter a remoção eventual de quaisquer arquivos intermediários com nomes diferentes do arquivo final (por exemplo, download_1.zip.tmp pode ser um arquivo intermediário para download_1.zip ) adicionando a opção --delete ao comando.

Durante a primeira execução de rsync , o arquivo download_1.zip.tmp será copiado para seu local de backup. Supondo que o download seja concluído em 30 minutos, o arquivo intermediário download_1.zip.tmp será renomeado para download_1.zip . Na execução seguinte de rsync , rsync não encontraria mais o arquivo intermediário download_1.zip.tmp (porque foi renomeado para download_1.zip ) e removeria download_1.zip.tmp e substituiria por download_1.zip no backup. Isso também removerá quaisquer outros arquivos do seu backup ( /mnt/dsbackup ) que não existam mais na origem ( /mnt/datastore ).

A partir da página man do rsync (versão 3.1.0):

This tells rsync to delete extraneous files from the receiving side (ones that aren’t on the sending side), but only for the directories that are being synchronized. You must have asked rsync to send the whole directory (e.g. "dir" or "dir/") without using a wildcard for the directory’s contents (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus gets a request to transfer individual files, not the files’ parent directory. Files that are excluded from the transfer are also excluded from being deleted unless you use the --delete-excluded option or mark the rules as only matching on the sending side (see the include/exclude modifiers in the FILTER RULES section).

    
por 22.01.2017 / 23:03