Informações da plataforma:
OpenBSD 6.2 amd64
$ rsync --version
rsync version 3.1.2 protocol version 31
Estou tentando sincronizar um diretório grande (4 TB) usando o seguinte daily.local
arquivo (para administradores do Linux, isso é essencialmente uma tarefa diária do cron):
#!/bin/sh
# Sync the primary storage device to the backup disk
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/
A cópia rsync inicial leva mais de um dia. Depois de um dia ou dois, acabo com várias cópias em execução do rsync na minha lista de processos: novos são iniciados conforme programado e esses novos processos parecem estar competindo entre si e não terminando a tarefa (pelo menos rapidamente)!
Existe uma maneira de tornar um novo processo rsync ciente de outros processos rsync (ou outra maneira de evitar condições de corrida rsync)?
Eu sei que poderia simplesmente executar o rsync manualmente para copiar o diretório pela primeira vez e/ou aumentar o intervalo de tempo agendado. Esta pergunta é mais do meu interesse, pois não consegui encontrar informações na net sobre esse tópico.
Uma solução que seria um pouco semelhante à solução de Mark , mas sem exigir alterações nos
/etc/fstab
sistemas de arquivos de montagem e desmontagem:Algumas notas sobre isso:
O
mkdir
é uma operação atômica, muito parecida commount
, que falhará se o diretório já existir, mas criará o diretório se não existir. Isso é mais seguro do que primeiro verificar um arquivo de bloqueio e depois criá-lo (duas etapas com a possibilidade de uma condição de corrida intermediária).O
EXIT
trap garante que o diretório de bloqueio seja excluído quando o script for encerrado. O diretório de bloqueio também seria excluído nas reinicializações (pelo sistema), pois está em/tmp
.Defino
PATH
o valor apropriado em vez de chamarrsync
com seu caminho completo. Isso é puramente cosmético, mas pode ser útil se o script for expandido posteriormente para usar outros comandos da coleção de ports do OpenBSD (comorestic
ouborgbackup
).A
-z
opção pararsync
é realmente necessária apenas em conexões de rede muito lentas (quando a compactação/descompactação de dados é feita mais rapidamente que a largura de banda da rede) e nunca para cópia local. Também costumo preferir-i
(--itemize-changes
) a-v
(--verbose
), pois isso me dirá exatamente por que um arquivo foi transferido.Para fazer backup de grandes quantidades de dados com segurança, geralmente eu recomendaria usar um software de backup escrito com propósito sobre
rsync
, comorestic
ouborgbackup
. Esses dois também fazem a desduplicação e a criptografia de dados e,borgbackup
opcionalmente, podem fazer a compactação.restic
é bom no sentido de que permite salvar backups em um servidor externo (por exemplosftp
, ), mesmo que esse servidor não tenharestic
instalado, enquantoborgbackup
exige que o software seja instalado no sistema de destino. Ambosrestic
eborgbackup
tratam do bloqueio do repositório de backup.Uma maneira de contornar esse problema (se o diretório de backup estiver em sua própria partição) é deixar o volume desmontado, montando logo antes de iniciar o comando rsync. Isso nega a necessidade de uso
flock
e pode ter o benefício de prolongar a longevidade da unidade/reduzir o consumo de energia./etc/fstab
: adicione anoauto
opção à partição para que ela não seja montada automaticamente na inicializaçãoNa tarefa
daily.local
oucron.daily
agendada:O operador de e comercial duplo (
&&
) só iniciará o próximo comando se o comando anterior for bem-sucedido. Portanto, se o disco de backup não puder ser montado (porque já está montado e o rsync já está sendo executado na partição), o restante do comando não prosseguirá.