Eu tenho o seguinte script usando rsync
para backup e sincronização dos meus arquivos.
Como posso tornar este script mais compacto, rápido e com melhor tratamento de erros?
#!/bin/sh
errors=""
sudo rsync -avh --delete --no-o --no-g /home/xralf/audio /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in audio"
else
errors="${errors}error in audio\n"
fi
sudo rsync -avh --delete --no-o --no-g /home/xralf/books /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in books"
else
errors="${errors}error in books\n"
fi
sudo rsync -avh --delete --no-o --no-g /home/xralf/source_code /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in source_code"
else
errors="${errors}error in source_code\n"
fi
# more such directories with this code pattern
echo ${errors}
Mais tarde pretendo não assistir a execução do script, então gostaria de ver apenas o resultado e acreditar que tudo deu certo. Executei o script, mas no final, a única informação que tenho é error in source_code
, e não consigo ver, qual é exatamente o erro (qual arquivo o causou).
Se você não é forçado a usar
sh
, mas pode usar um shell mais complexo comobash
, você pode fazer algo assim:Você provavelmente também deseja capturar stderr, mas isso faz a mesma coisa que seu script.
Se sua prioridade é ser compacto e rápido (ou seja: minimizar o número de processos, mas neste caso você está limitado por seus IOs de disco, não por CPU ou memória):
A remoção da
-v
opção tornará a saída menos ruidosa, para que você possa se concentrar em erros explícitos, se houver. O1>&2
redireciona STDOUT para STDERR, para que as mensagens de erro sejam enviadas onde esperado. Se estiver executando sem supervisão, as seguintes alternativas podem ser melhores opções do que o built-inecho
, ao custo de um processo extra:um servidor pode usar
logger
para enviar a mensagemsyslog
para manipulação centralizada. A sintaxe exata dependerá da configuração do servidor.usando
date
para adicionar informações de tempo, com a última linha do script se tornando:alguns que ele produzirá algo como
[2022/11/05 14:37:27] rsync completed successfully
O
rsync
comando aceita o parâmetro--log-file=FILE
. Você pode examiná-lo em busca de erros quando o backup estiver concluído.Por uma questão de eficiência, também aceita
--exclude-from=FILE
e--include-from=FILE
. Você pode criar arquivos de texto contendo uma lista de tudo o que você faz e não deseja fazer backup e chamá-los de um únicorsync
comando em vez de vários.Consulte
man rsync
ou a página de manual online .Crie um arquivo chamado module.sh e dê a ele o seguinte texto:
Então você cria outro arquivo e origina o módulo de lá:
Observe o Shebang diferente, este é compatível com POSIX.
Eu também adicionei a opção -z do Rsync. Ele comprime os dados em rota.