bash script alert em erro

4

Eu tenho um script que faz. ls, cp, mv Eu quero que se qualquer um dos comandos falhar isso deve alertar por e-mail, bem como após a concorrência bem sucedida. Qualquer ideia? Posso ajustar o alerta de email, mas quero saber como verificar erros e tentativas bem-sucedidas.

    
por User4283 27.03.2011 / 20:45

4 respostas

4

Você pode ter uma série de comandos que continuam a ser executados até "falha" usando "& &" para executar os comandos em sucessão; cada comando retorna "true", fazendo com que o seguinte comando seja executado. Então use "||" para executar um comando após falha, como:

#!/bin/bash

cp foo bar \
  && mv bar bar{,.bak} \
  && echo "good so far" \
  && ls file123 | tee -a /tmp/msg.txt \
  && mailx -u user -s "success" -f /tmp/msg.txt \
  ||  mailx -u user -s "failure" -f ~/err.txt

Como isso pode ficar confuso, use funções, como

#!/bin/bash

do_work() {
  mv... || return 1
  cp... || return 1
  return 0
}

report() {
  [ "$1" = "ok" ] && mailx ....
  [ "$1" != "ok" ] && mailx -s "$1" ....
  return 0
}

do_work \
  && report ok 
  || report err
Além disso, seguindo o exemplo acima, você pode adicionar regras gerais por meio de um 'trap' no script que sempre executará certos comandos se qualquer tipo de status de erro for retornado em qualquer ponto do script (incluindo o recebimento de um controle). c (interromper) sinal enquanto o script está sendo executado):

#!/bin/bash
tmp=/tmp/msg.$$.txt

# Cleanup: delete tmp files on exit. On any error, trap and exit... then cleanup
trap 'echo "cleaning up tmpfiles..." && rm $tmp >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15

...

do_work && exit 0

(Aviso de isenção de responsabilidade ... os comandos mostrados acima são pseudo-códigos gerais, e são apenas digitados da memória sem executá-los. Os Typos certamente existem.)

    
por 05.05.2011 / 00:55
6

O Bash não tem nenhum alerta embutido para essas coisas, você precisa escrevê-lo em seu script verificando a variável $? (mantém o código de saída do último comando de execução) e executando uma ação nele.

Uma verificação simples e simples de que os e-mails seriam:

if [ $? -ne 0 ]
then
    <send me email however you want to about failure>
else
    <send me email about success how ever you want> 
fi

Certifique-se de verificar sua documentação de comando para garantir que a execução bem-sucedida defina um código de saída de 0.

    
por 27.03.2011 / 20:51
3

Você usa um wrapper de comando mailwrap, que usa algumas opções especificando para quem enviar mensagens, antes de executar o comando que é seu parâmetro. O comando mailwrap só envia email se houver saída ou se o script falhar. Existem muitas variantes por aí, e são bons exercícios para se escrever se você não gosta daqueles que encontra.

Na linha #! do próprio script, você usa -e , para que qualquer pipeline de comando que falhe faça com que o script seja abortado nesse ponto. Você também pode usar -u para interromper o uso de uma variável não definida.

Para que um comando com falha não aborte o script, você anexa || true , como "true", para que a falha não importe. (Mais idiomaticamente, || : , que é a mesma coisa).

Se você quer ver exatamente onde um comando normalmente silencioso falhou, você usa um comando mailwrap que não envia e-mail apenas por causa da saída para stderr e então usa -v no shell #! line, para rastrear comandos quando eles estão prestes a serem executados.

    
por 27.03.2011 / 22:29
1

Ou canalize a saída do script em um e-mail, seja qual for o resultado, até que você esteja feliz de que está funcionando.

Algo como:

(cat $resultofscript) | mailx -s "Subject" [email protected]

    
por 27.03.2011 / 21:26