Tem saída de e-mail do cron para MAILTO com base no status de saída

10

Eu tenho um cron job executando um comando php assim:

php /path/to/script.php > dev/null

Isso deve enviar apenas a saída STDERR para o endereço MAILTO. Pelo que eu sei, o script php não está enviando nenhuma informação STDERR mesmo quando o status de saída é 1.

Como posso obter a saída do comando php (STDOUT) e enviá-la apenas para MAILTO se o status de saída for diferente de zero?

    
por Dave 05.12.2012 / 00:51

3 respostas

12
php /path/to/script.php > logfile || cat logfile; rm logfile

que despeja a saída padrão em logfile e somente a envia se o script falhar (sai diferente de zero).

Observação: se seu script também puder ser enviado para stderr , você deverá redirecionar stderr para stdout . Caso contrário, qualquer coisa impressa em stderr fará com que o cron envie um email, mesmo que o código de saída seja 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
    
por 05.12.2012 / 01:04
2

Como a saída é gerada antes que o status de saída seja conhecido, você terá que armazená-la em algum lugar.

Uma possibilidade é armazená-lo em uma variável do shell:

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

Isso não preserva completamente a saída do script (remove linhas em branco à direita), mas tudo bem para esse caso de uso. Se você deseja preservar linhas em branco à direita:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

Se houver um grande potencial de saída, talvez você prefira armazená-lo em um arquivo temporário:

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
    
por 05.12.2012 / 01:03
1

Você já considerou crônica de moreutils . Acho que faz exatamente o que você quer:

chronic runs a command, and arranges for its standard out and standard error to only be displayed if the command fails (exits nonzero or crashes). If the command succeeds, any extraneous output will be hidden.

Em verificações recentes, há uma opção -e para mostrar também a saída completa se alguma coisa foi gravada em stderr.

    
por 22.04.2018 / 08:15

Tags