Uma solução que seria um pouco semelhante à solução de Mark , mas sem exigir alterações no /etc/fstab
ou Montando e desmontando sistemas de arquivos:
#!/bin/sh
lockdir=/tmp/file-copy.lock
if ! mkdir "$lockdir"; then
echo 'File copy already in progress' >&2
exit 1
fi
trap 'rmdir "$lockdir"' EXIT
PATH=$PATH:/usr/local/bin
rsync -ai ...
Algumas notas sobre isso:
-
A mkdir
é uma operação atômica, muito parecida com mount
, 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 trap EXIT
garante que o diretório de bloqueio seja excluído quando o script terminar. O diretório de bloqueio também seria excluído nas reinicializações (pelo sistema), pois está em /tmp
.
-
Eu defino PATH
para o valor apropriado em vez de chamar rsync
com seu caminho completo. Isso é puramente uma coisa cosmética, mas pode ser útil se o script for expandido para usar outros comandos da coleção de ports do OpenBSD (como restic
ou borgbackup
).
-
A opção -z
para rsync
é realmente necessária somente em conexões de rede muito lentas
(quando a compactação / descompactação de dados é feita mais rápido que a largura de banda da rede) e nunca para cópia local. Também tenho a tendência de favorecer o -i
( --itemize-changes
) sobre -v
( --verbose
), pois isso me dirá exatamente por que um arquivo foi transferido.
Para fazer o backup de grandes quantidades de dados com segurança, eu geralmente recomendaria o uso de um software de backup escrito para fins específicos sobre rsync
, como restic
ou borgbackup
. Esses dois também fazem a desduplicação e a criptografia de dados, e borgbackup
pode, opcionalmente, fazer compactação. restic
é bom no sentido de permitir salvar backups em um servidor externo (por exemplo, sftp
), mesmo que o servidor não tenha restic
instalado, enquanto borgbackup
exige que o software esteja instalado o sistema de destino. Tanto restic
quanto borgbackup
manipulam o bloqueio do repositório de backup.