Comment obtenir des courriels de cron-jobs (échoués) sous Ubuntu?

45

Je crée des tâches cron dans Ubuntu en plaçant l'exécutable dans l'un des /etc/cron.{daily,hourly,monthly,weekly}. Il y a beaucoup de 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

Je souhaite recevoir des courriers électroniques de mes scripts lorsque:

  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 fonctionne, j'envoyer mes messages de mon compte Google. Le fait que SSMTP ne puisse envoyer du courrier qu'en utilisant un seul compte ne me pose pas de problème. C'est juste un serveur domestique et les utilisateurs que j'ai n'ont pas la possibilité d'ajouter des tâches cron.

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

Supprimé
la source

Réponses:

60

Par défaut, cron enverra un e-mail au propriétaire du compte sous lequel la crontab est en cours d'exécution.

La crontab à l'échelle du système est dans / etc / crontab s'exécute sous l'utilisateur 'root'

Étant donné que root est largement utilisé, je recommanderais de toute façon d'ajouter un alias racine à votre fichier / etc / aliases. (lancez 'newaliases' après)

La manière habituelle de structurer cela est que root soit associé à un autre utilisateur du système, par exemple pour moi, alias "root" vers "phil" (mon compte utilisateur) et alias "phil" sur mon adresse électronique externe.

Si vous souhaitez envoyer par courrier électronique un cron d'utilisateur spécifique, vous pouvez utiliser à nouveau / etc / aliases (à condition que vous disposiez d'un accès superutilisateur) pour rediriger l'utilisateur vers une autre adresse e-mail. haut de votre crontab:

MAILTO="[email protected]"

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

MAILTO=someuser

Si vous avez besoin de plus d'informations, consultez crontab (5) en lançant:

man 5 crontab
Philip Reynolds
la source
Les /etc/aliasesentrées ne sont-elles pas censées suivre le format name: value1, value2, ... ? Je ne sais pas, le format a peut-être changé au cours des 8 dernières années.
Nathan Jones
1
"Pour moi, je dirais" racine "en" phil "(mon compte utilisateur) et" phil "en adresse électronique externe." Comment alias 'phil' à une adresse email externe?
Howard Lee
29

Afin de recevoir les courriers électroniques envoyés par vixie cron, vous aurez besoin de quelque chose qui réplique la commande sendmail. Donc installer postfix ou SSMTP va régler cette partie. Si vous utilisez postfix, le fichier alias peut être utilisé pour mapper les utilisateurs du système avec de véritables adresses électroniques.

Si vous ajoutez MAILTO = "[email protected]" au sommet d'une crontab, toute sortie du travail cron sera envoyée par courrier électronique. Ceci est indépendamment du code d'erreur.

Pour les scripts qui génèrent des erreurs correctement dans STDERR, il est facile de recevoir un courrier électronique uniquement lorsqu'ils se trompent, procédez comme suit:

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

Cela ne fera que rediriger le STDOUT vers null. Si des messages STDERR sont présents, ils recevront un courrier électronique.

Cependant, j'ai constaté que certains scripts produiraient des erreurs de manière incorrecte sous STDOUT et définiraient le code de sortie sur 1. Je n'ai pas trouvé de moyen de récupérer le résultat, mais ignore le résultat si le code de sortie est 0. La seule méthode Je peux penser est de rediriger la sortie vers un fichier, puis si le code de sortie n'est pas 0, le fichier doit être récupéré par cron. Cela semble assez horrible.

Théozaurus
la source
3
Pourrait essayer habilis.net/cronic
dfrankow
8

Si vous voulez envoyer toutes les sorties (stdout et stderr) à une adresse spécifique, vous pouvez utiliser la MAILTOvariable. Par exemple, placez le texte suivant en haut du script.

MAILTO="[email protected]"
Dan Carley
la source
5

essayez d'ajouter "root: [email protected]" à / etc / aliases

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

Tant que le script génère quelque chose, vous recevrez un mail.

Daniel P
la source
3

Sur tous mes serveurs de production, qui exécutent généralement environ 20 tâches cron par jour, je ne jure que par le paquet python-cronwrap. Découvrez-le ici: http://pypi.python.org/pypi/cronwrap . C'est vraiment facile à configurer et surtout fiable.

Faible Kian Seong
la source
2

Je ne pense pas que SSMTP est à la hauteur de ce que vous devez faire. Vous avez besoin de quelque chose qui puisse "recevoir" du courrier des processus cron, puis l'envoyer à votre vraie boîte aux lettres.

J'utilise Sendmail, mais c'est parce que je suis une vieille main de Sun; Je sais que tous les enfants cools qui utilisent Postfix se moquent de nous. Votre communauté Ubuntu peut vous aider à configurer votre système de messagerie.

David Mackintosh
la source
ssmtp implémente / bin / sendmail
bobpaul
2

Une alternative - J'archive tout le courrier root dans certains fichiers, puis je supprime le courrier d'origine.

Je cron un script (voici la partie clé) -

#!/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

Cela garde les choses en ordre et je peux garder un œil dessus. Je pourrais envoyer un fichier de courrier quotidien à un identifiant de messagerie externe, etc.

irdroid3
la source