Como obter e-mail de (com falha) cron-jobs no Ubuntu?

45

Eu crio cron-jobs no Ubuntu colocando o executável em um dos /etc/cron.{daily,hourly,monthly,weekly}. Existem muitos diretórios começando com cron:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

Gostaria de receber emails dos meus scripts quando:

  1. Um script falha e fornece um código de saída diferente de zero.
  2. O script tem algo a me dizer

Tenho o SSMTP instalado e funcionando, envio meus e-mails da minha conta do Google. O fato de o SSMTP poder enviar apenas emails usando uma conta não é um problema para mim. É apenas um servidor doméstico e os usuários que eu tenho não têm a capacidade de adicionar cron-jobs.

Gostaria de saber como a correspondência de scripts geralmente funciona no Linux / Unix em geral e no Ubuntu especificamente. Eu também gostaria de saber uma boa maneira de receber e-mails nas duas situações acima.

Excluído
fonte

Respostas:

60

Por padrão, o cron enviará um e-mail ao proprietário da conta na qual o crontab está sendo executado.

O crontab em todo o sistema está em / etc / crontab e é executado sob o usuário `root '

Como o root é amplamente utilizado, eu recomendaria adicionar um apelido de raiz ao seu arquivo / etc / aliases de qualquer maneira. (execute 'newaliases' depois)

A maneira normal de estruturar isso é que o root seja aliasado para outro usuário no sistema, por exemplo, eu faria o 'root' para 'phil' (minha conta de usuário) e 'phil' para o meu endereço de email externo.

Se você tiver um cron de usuário específico que deseja enviar por e-mail na saída, poderá usar o / etc / aliases novamente (desde que tenha acesso de superusuário) para redirecionar o usuário para outro endereço de email, ou use o seguinte no topo do seu crontab:

MAILTO="[email protected]"

Se o email deve ser enviado para um usuário local, você pode colocar apenas o nome de usuário:

MAILTO=someuser

Se você precisar de mais informações, consulte o crontab (5) executando:

man 5 crontab
Philip Reynolds
fonte
As /etc/aliasesentradas não devem seguir o formato name: value1, value2, ... ? Não sei, talvez o formato tenha sido alterado em algum momento nos últimos 8 anos.
Nathan Jones
1
"para mim, alias 'raiz' para 'phil' (minha conta de usuário) e alias 'phil' para meu endereço de email externo." Como alias 'phil' para um endereço de email externo?
Howard Lee
29

Para receber o email do vixie cron, você precisará de algo que replique o comando sendmail. Portanto, a instalação do postfix ou SSMTP classificará essa parte. Se você estiver usando o postfix, o arquivo de aliases poderá ser usado para mapear os usuários do sistema para endereços de email reais.

Adicionar MAILTO = "[email protected]" na parte superior de um crontab fará com que qualquer saída do trabalho cron seja enviada por email. Isso é independente do código de erro.

Para scripts que geram erros corretamente no STDERR, é fácil receber emails apenas quando eles dão errado, faça o seguinte:

MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null

Isso redirecionará apenas o STDOUT para nulo. Se alguma mensagem STDERR estiver presente, eles receberão um email para você.

No entanto, descobri que alguns scripts geram erros incorretamente como STDOUT e definem o código de saída como 1. Não descobri uma maneira de obter a saída deles, mas ignore a saída se o código de saída for 0. O único método Eu posso pensar em é redirecionar a saída para um arquivo, então se o código de saída não for 0, envie esse arquivo para o cron pegar. Parece bastante horrível embora.

Teozauro
fonte
3
Pode tentar habilis.net/cronic
dfrankow
8

Se você quiser enviar toda a saída (stdout e stderr) para um endereço específico, poderá usar a MAILTOvariável Por exemplo, coloque o seguinte na parte superior do script.

MAILTO="[email protected]"
Dan Carley
fonte
5

tente adicionar "root: [email protected]" em / etc / aliases

que enviará todas as mensagens desse usuário para o seu email. se você não quiser todas as mensagens, poderá criar um usuário especificamente para isso.

Contanto que o script produza algo, você receberá um email.

Daniel P
fonte
3

Em todos os meus servidores de produção, que normalmente executam cerca de 20 cronjobs por dia, juro pelo pacote python-cronwrap. Confira aqui: http://pypi.python.org/pypi/cronwrap . É realmente fácil de configurar e, acima de tudo, confiável.

Baixo Kian Seong
fonte
2

Eu não acho que o SSMTP depende do que você precisa fazer. Você precisa de algo que possa "receber" emails dos processos cron e enviá-los para sua caixa de correio real.

Eu uso o Sendmail, mas isso é porque eu sou um veterano da Sun; Eu sei que é ridicularizado por todas as crianças legais hoje em dia que usam o Postfix. Sua comunidade ubuntu pode guiá-lo na configuração do seu sistema de correio.

David Mackintosh
fonte
Implementar o ssmtp / bin / sendmail
bobpaul
2

Uma alternativa - arquivo todos os emails raiz em alguns arquivos e excluo o email original.

Eu crono um script (aqui está a parte principal) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

Isso mantém as coisas arrumadas e eu posso ficar de olho nisso. Eu poderia enviar por e-mail um arquivo de mensagens diárias para um ID de e-mail externo, etc.

irdroid3
fonte