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

43

Eu criei cron-jobs no Ubuntu colocando o executável em um dos /etc/cron.{daily,hourly,monthly,weekly} . Existem muitos diretórios começando com o 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

Eu gostaria de receber e-mails 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

Eu tenho SSMTP instalado e funcionando, envio meus e-mails da minha conta do Google. O fato de o SSMTP só poder enviar e-mails 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 tarefas cron.

Eu gostaria de saber como o envio de scripts geralmente funciona no Linux / Unix em geral e no Ubuntu especificamente. Eu também gostaria de saber de uma boa maneira para eu receber e-mails nas duas situações acima.

    
por Deleted 14.08.2009 / 12:01

7 respostas

57

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

O crontab do sistema está em / etc / crontab executado sob o usuário 'root'

Como o root é usado amplamente, eu recomendo adicionar um alias de raiz ao seu arquivo / etc / aliases. (execute 'newaliases' depois)

A maneira normal de estruturar isso é a raiz ser aliada para outro usuário no sistema, por exemplo, para mim eu alias 'root' para 'phil' (minha conta de usuário) e alias 'phil' para meu endereço de e-mail externo.

Se você tiver um usuário específico cron que gostaria de receber por e-mail no resultado, poderá usar / etc / aliases novamente (desde que tenha acesso de superusuário) para redirecionar o usuário para outro endereço de e-mail ou seguindo no topo do seu crontab:

MAILTO="[email protected]"

Se o e-mail for enviado para um usuário local, você poderá colocar apenas o nome de usuário:

MAILTO=someuser

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

man 5 crontab
    
por 14.08.2009 / 12:45
27

Para receber e-mails enviados pelo vixie cron, você precisará de algo que replique o comando sendmail. Portanto, instalar o postfix ou o SSMTP classificará essa parte. Se você usar o postfix, o arquivo de aliases poderá ser usado para mapear os usuários do sistema para endereços de e-mail reais.

Adicionar MAILTO="[email protected]" ao topo de um crontab fará com que qualquer saída do cron job seja enviada por e-mail. Isso é independente do código de erro.

Para scripts que geram erros corretamente no STDERR, é fácil receber emails apenas quando errarem, faça isso:

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

Isso redirecionará apenas o STDOUT para nulo. Se houver mensagens STDERR, elas receberão um e-mail para você.

No entanto, descobri que alguns scripts geram erros incorretamente como STDOUT e definem o código de saída como 1. Ainda não descobri uma maneira de obter a saída deles, mas ignoro a saída se o código de saída for 0. O único método que posso pensar é 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 muito horrível.

    
por 27.10.2009 / 18:34
8

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

MAILTO="[email protected]"
    
por 14.08.2009 / 12:18
5

tente adicionar "root: [email protected]" ao / 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 mostre algo, você receberá um e-mail.

    
por 14.08.2009 / 12:14
3

Em todos os meus servidores de produções que normalmente executam cerca de 20 cronjobs diariamente, eu juro pelo pacote python-cronwrap. Confira aqui: link . É muito fácil de configurar e, acima de tudo, confiável.

    
por 29.07.2011 / 03:44
2

Eu não acho que o SSMTP esteja preparado para o que você precisa fazer. Você precisa de algo que possa "receber" mensagens dos processos cron e enviá-las para sua caixa de correio real.

Eu uso o Sendmail, mas isso é porque eu sou uma velha mão da Sun; Eu sei que é ridicularizado por todas as crianças legais que usam o Postfix. Sua comunidade do ubuntu pode orientá-lo na configuração do seu sistema de e-mail.

    
por 14.08.2009 / 17:47
2

Uma alternativa - Eu arquive todos os e-mails raiz em alguns arquivos e excluo o e-mail original.

Eu agi um script (aqui é a parte chave) -

#!/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 tudo organizado e eu posso ficar de olho nele. Eu poderia enviar um arquivo de e-mail diário para um ID de e-mail externo, etc ...

    
por 27.05.2014 / 19:05