Uma resposta pouco desorganizada, mas apenas leia, por favor.
Para fazer com que o seu script pare quando houver algum tipo de erro:
set -e
Isso garantirá que, se qualquer dos seus comandos falhar, o script falhará. Outras boas ideias:
function error_handler() {
# This will get run when an error is detected
}
trap error_handler ERR
Isso executará o error_handler
quando um comando falhar. Você também pode ter um manipulador EXIT
para executar o código toda vez que o script sair.
Para capturar todos os resultados do seu script em um arquivo:
exec &> some_log_file
Para também poder ver os comandos que seu script executa no arquivo de log (excelente para solução de problemas):
set -x
Para fazer seu script lançar avisos sobre variáveis indefinidas:
set -u
Para resumir, inicie seu script com:
trap error_handler ERR
exec &> some_log_file
set -eux
Se você estiver executando o script do cron, ele enviará um e-mail se houver alguma saída do seu script. Para receber o e-mail apenas quando houver um problema, coloque um cat some_log_file
no manipulador de erros e você está definido.
Atualizar : para responder às suas outras perguntas.
- Para evitar que um erro quebre o script inteiro, você pode executar o comando em uma instrução
if
. Comoif ! <some command>; then <what do you do if it fails, or possibly nothing>; fi
- Se você tiver
trap error_handler
, também precisará definir umfunction error_handler
. - O embaralhamento de
set -eu
eset -eux
não é uma má ideia, mas ... -
... se você está preocupado com a segurança, você não deve colocar a senha mysql na linha de comando (qualquer um que executar
pgrep -lf mysql
vai ver). Use um arquivo de opções. E então você não precisa se preocupar com senhas nos arquivos de log.option_file='mktemp' cat > $option_file <<EOF [client] password = $DB_PASSWD user = $DB_USER EOF
Em seguida, execute
mysqldump
com--default-extra-path=$option_file
. E não esqueça de deletar$option_file
quando você não precisar mais dele. - Use
rsync
em vez descp
. Funciona muito melhor para copiar arquivos relativamente grandes.