Saída do cron de correio somente quando o Git lança um erro real

4

Existe um repositório do Git que está em um servidor, nós queremos gerar a saída do doxygen para ele em um servidor diferente. O comando a seguir funciona para mim, mas tem o lado negativo de enviar um e-mail toda vez que o repo é atualizado porque o Git usa o stderr para gerar relatórios de progresso (uma pesquisa rápida pelo oráculo todo-poderoso sugere que eles consideram esse comportamento como um recurso).

59 * * * * cd FQNameOfRepo; git pull 1>/dev/null; make doc-all 1>/dev/null; cp doc/latex/refman.pdf doc/html/

Embora eu possa grep através da saída stderr do Git ou compará-la a uma string conhecida, isso parece errado. Estou usando o comando errado do Git? Como isso seria feito corretamente?

Para esclarecimentos, eu ainda quero que este comando envie um e-mail se ocorrer um erro real, portanto, simplesmente redirecionar o stderr não ajudará.

    
por Max 28.12.2012 / 19:12

3 respostas

1

Basear-se muito nas capacidades de envio de mensagens da crond pode gerar vários problemas. Dependendo da sua crona, eles talvez não sejam flexíveis o suficiente.

Por exemplo, muitas vezes, como você descreveu, não é possível configurar que apenas um status de saída! = 0 deve acionar a correspondência de stdout / stderr. Outra questão é que, por exemplo, o Solaris crond tem um limite de tamanho (relativamente) pequeno na saída que captura / mails.

Assim, para tais situações, sugiro escrever um pequeno script auxiliar que chame os comandos e redirecione a saída para um arquivo de log temporário. Ele pode acompanhar internamente o status de saída de todos os programas e, se um deles for! = 0:

  • gere o arquivo de log para stdout
  • envie-o por meio de uma ferramenta de correio da linha de comando
  • ou apenas diagnósticos curtos de saída que incluem o local do arquivo de log

Algo como:

$ cat helper.sh
set -u
set -e

# setup log-file $LOG
# ...

cd FQNameOfRepo
set +e

git pull 1>/dev/null 2>> $LOG
r1=$?
make doc-all 1>/dev/null 2>> $LOG
r2=$?
cp doc/latex/refman.pdf doc/html/ 2>> $LOG
r3=$?

set -e

if [ $r1 -ne 0 -o $r2 -ne 0 -o $r3 -ne 0 ]; then
    # do some stuff, print/mail $LOG or something like that, etc.
    # ...
    exit 23
fi
    
por 28.12.2012 / 22:06
1

Armazena a saída em uma variável ou arquivo temporário e a imprime apenas se o status de retorno for diferente de zero.

59 * * * * errors=$( { cd FQNameOfRepo && git pull && make doc-all && cp doc/latex/refman.pdf doc/html/; } 2>&1 >/dev/null) || { ret=$?; echo "$errors"; exit $ret; }

(Você pode querer colocar uma frase longa em um script).

    
por 01.01.2013 / 04:46
0

Você pode usar o rsyslog. Tem um módulo de saída de correio. Configure um módulo de filtro que captura o erro específico do repositório git e direcione-o para o (s) destino (s) de correio.

    
por 29.12.2012 / 02:30