54 votes

Comment obtenir des courriels à partir de tâches cron (qui ont échoué) dans Ubuntu ?

Je crée des cron-jobs dans Ubuntu en plaçant l'exécutable dans l'un des emplacements suivants /etc/cron.{daily,hourly,monthly,weekly} . Il existe de nombreux répertoires commençant par 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

J'aimerais recevoir des e-mails de mes scripts quand :

  1. Un script échoue et donne un code de sortie non nul.
  2. Le script a quelque chose à me dire

J'ai SSMTP installé et fonctionnel, j'envoie mes mails depuis mon compte Google. Le fait que SSMTP ne puisse envoyer du courrier qu'à partir d'un seul compte n'est pas un problème pour moi. C'est juste un serveur domestique et les utilisateurs que j'ai n'ont pas la possibilité d'ajouter des cron-jobs.

J'aimerais savoir comment le mailing de scripts fonctionne habituellement dans Linux/Unix en général et dans Ubuntu en particulier. J'aimerais également connaître un bon moyen pour moi de recevoir des courriers dans les deux situations ci-dessus.

68voto

David Pokluda Points 4284

Par défaut, cron enverra un courrier électronique au propriétaire du compte sous lequel la crontab est exécutée.

La crontab générale se trouve dans /etc/crontab et s'exécute sous l'utilisateur `root'

Comme l'utilisation de root est très répandue, je recommande d'ajouter un alias root à votre fichier /etc/aliases. (lancez 'newaliases' après)

La manière normale de structurer cela est d'attribuer à root un alias vers un autre utilisateur du système. Par exemple, pour moi, j'attribuerais à root un alias vers phil (mon compte d'utilisateur) et à phil un alias vers mon adresse électronique externe.

Si vous avez un cron d'utilisateur spécifique que vous souhaitez recevoir par courriel à la sortie, vous pouvez utiliser à nouveau /etc/aliases (à condition d'avoir un accès superutilisateur) pour rediriger l'utilisateur vers une autre adresse de courriel, ou vous pouvez utiliser ce qui suit en haut de votre crontab :

MAILTO="email@domain.com"

Si le courrier doit être envoyé à un utilisateur local, vous pouvez indiquer uniquement le nom d'utilisateur :

MAILTO=someuser

Si vous avez besoin de plus d'informations, consultez crontab(5) en exécutant :

man 5 crontab

32voto

mgarciaisaia Points 521

Pour que le courrier électronique soit envoyé à partir de vixie cron, vous aurez besoin de quelque chose qui réplique la commande sendmail. L'installation de postfix ou de SSMTP résoudra ce problème. Si vous utilisez postfix, le fichier aliases peut être utilisé pour faire correspondre les utilisateurs du système à des adresses e-mail réelles.

L'ajout de MAILTO="foo@bar.com" au début d'une crontab entraînera l'envoi par courrier électronique de toute sortie de la tâche cron. Et ce, quel que soit le code d'erreur.

Pour les scripts qui produisent des erreurs correctement dans STDERR, il est alors facile d'obtenir un email uniquement lorsqu'ils vont mal, il suffit de faire ceci :

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

Cela redirigera uniquement le STDOUT vers null. Si des messages STDERR sont présents, ils vous seront envoyés par email.

Cependant, j'ai découvert que certains scripts scripts produisaient des erreurs de manière incorrecte en tant que STDOUT et fixaient le code de sortie à 1. Je n'ai pas trouvé de moyen de récupérer la sortie de ces scripts, mais d'ignorer la sortie si le code de sortie est 0. La seule méthode à laquelle je peux penser est de rediriger la sortie vers un fichier, puis si le code de sortie n'est pas 0, de sortir ce fichier pour que cron le récupère. Cela semble assez horrible.

9voto

Dan Carley Points 24959

Si vous souhaitez envoyer toutes les sorties (stdout et stderr) à une adresse spécifique, vous pouvez utiliser la commande MAILTO variable. Par exemple, placez ce qui suit au début du script.

MAILTO="address@example.com"

5voto

Daniel P Points 185

Essayez d'ajouter "root : your@email.address" à /etc/aliases

qui enverra tous les messages de cet utilisateur à votre adresse électronique. si vous ne souhaitez pas recevoir tous les messages, vous pouvez créer un utilisateur spécifiquement pour cela.

Tant que le script produit quelque chose, vous recevrez un courrier.

3voto

Low Kian Seong Points 341

Sur tous mes serveurs de production qui exécutent environ 20 cronjobs par jour, je ne jure que par le paquet Python-cronwrap. Jetez-y un coup d'œil ici : http://pypi.Python.org/pypi/cronwrap . Il est vraiment facile à configurer et surtout fiable.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X