Meus backups estão todos reunidos

1

Eu tenho um cron job que executa um comando rsync que faz um backup remoto a cada duas horas.

No caso de o backup remoto anterior ainda estar em execução, encapsulei este comando rysnc dentro de um comando flock.

Flock impede que este comando seja executado várias vezes simultaneamente:

flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ [email protected]:/home/remoteuser/backupFolder'  || echo "Couldn't perform remote backup, because previous remote backup is still in progress."

No entanto, se eu reinicializar o servidor remoto durante um desses backups (para simular um cenário de conexão interrompido), o floco continuará a bloquear tentativas futuras porque o processo anterior (embora permanentemente desconectado do destino de backup) persiste.

Qual é a melhor maneira de fazer o flock saber que o rsync falhou indefinidamente e, portanto, liberar esses bloqueios que estão impedindo que futuras tentativas sejam iniciadas?

Na página man do rsync, vejo que há um argumento --timeout. Está definindo que a melhor maneira de lidar com bloqueios em torno do relógio do floco?

    
por LonnieBest 02.12.2013 / 20:12

1 resposta

1

Isso não responde à sua pergunta sobre flock , mas pode ajudar independentemente disso. Houve uma pergunta semelhante sobre as estratégias de backup há algum tempo e eu gostei minha resposta suficiente para implementá-la.

A idéia básica é fazer com que seu script de backup crie um arquivo no destino de backup quando ele for concluído e exclua o arquivo assim que ele começar a ser executado. Então, você faz um teste de script para a existência do arquivo e apenas permite que ele seja executado se o arquivo existir:

#!/usr/bin/env bash

## Make sure no backup is currently running
if [ ! -e /path/to/backup/backup_finished.txt ]; then 
  echo "A backup seems to be running, or did not finish correctly, exiting." && 
  exit;
fi
## Delete the file from the remote server
ssh user@remote rm /path/to/backup/backup_finished.txt

## Do da rsync 
rsync /path/to/source/ user@remote:/path/to/daily/backup/

## Create the file on the remote server
ssh user@remote touch /path/to/backup/backup_finished.txt

Esta é uma abordagem muito mais simplista do que a sua, mas tem a vantagem de que eu posso pegar (embora não lidar de forma graciosa) backups inacabados. Você pode expandir isso para testar se um backup está realmente em execução ou se um antigo não saiu corretamente e reagiu de acordo.

Como você precisa monitorar processos nas máquinas locais e remotas, não acho que um sistema de arquivos de bloqueio funcionará.

    
por 02.12.2013 / 20:54