cron
já envia a saída padrão e o erro padrão de cada trabalho executado por correio para o proprietário do trabalho cron.
Você pode usar MAILTO=recipient
nocrontab
arquivo para enviar os emails para uma conta diferente.
Para que isso funcione, você precisa ter o correio funcionando corretamente. Entregar em uma caixa de correio local geralmente não é um problema (de fato, as chances sãols -l "$MAIL"
que você já esteja recebendo alguns), mas para tirá-lo da caixa e colocá-lo na Internet é necessário o MTA (Postfix, Sendmail, o que você tem) para esteja configurado corretamente para conectar-se ao mundo.
Se não houver saída, nenhum email será gerado.
Uma organização comum é redirecionar a saída para um arquivo. Nesse caso, é claro que o daemon cron não verá o trabalho retornar nenhuma saída. Uma variante é redirecionar a saída padrão para um arquivo (ou gravar o script para que ele nunca imprima nada - talvez armazene resultados em um banco de dados ou execute tarefas de manutenção que simplesmente não produzem nada?) E receba um email apenas se houver é uma mensagem de erro.
Para redirecionar os dois fluxos de saída, a sintaxe é
42 17 * * * script >>stdout.log 2>>stderr.log
Observe como anexamos (duplo >>
) em vez de substituir, para que a saída de qualquer trabalho anterior não seja substituída pela próxima.
Conforme sugerido em muitas respostas aqui, você pode enviar os dois fluxos de saída para um único arquivo; substitua o segundo redirecionamento por 2>&1
"erro padrão deve ir para onde a saída padrão estiver indo". (Mas eu particularmente não apoio essa prática. Principalmente faz sentido se você realmente não espera nada na saída padrão, mas pode ter esquecido alguma coisa, talvez proveniente de uma ferramenta externa chamada no seu script.)
cron
trabalhos são executados no diretório inicial, portanto, qualquer nome de arquivo relativo deve ser relativo a isso. Se você deseja gravar fora do diretório inicial, obviamente precisará separadamente garantir que tenha acesso de gravação ao arquivo de destino.
Um antipadrão comum é redirecionar tudo para /dev/null
(e depois pedir ao Stack Overflow para ajudá-lo a descobrir o que deu errado quando algo não está funcionando; mas também não podemos ver a saída perdida!)
No script, mantenha a saída regular (resultados reais, de preferência em formato legível por máquina) e os diagnósticos (geralmente formatados para um leitor humano) separados. Em um script de shell,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Algumas plataformas (e, por exemplo, o GNU Awk) permitem que você use o nome do arquivo /dev/stderr
para mensagens de erro, mas isso não é adequadamente portátil; em Perl warn
e die
imprima com erro padrão; em Python, escreva para sys.stderr
ou use logging
; em Ruby, tente $stderr.puts
. Observe também como as mensagens de erro devem incluir o nome do script que produziu a mensagem de diagnóstico.