web-dev-qa-db-fra.com

Comment obtenir des e-mails à partir de cron-jobs (échoués) dans Ubuntu?

Je crée des cron-jobs dans Ubuntu en plaçant l'exécutable dans l'un des /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

Je souhaite recevoir des e-mails 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 fonctionnel, j'envoie mon courrier depuis mon compte Google. Le fait que SSMTP ne puisse envoyer du courrier qu'avec 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 tâches cron.

Je voudrais savoir comment le mailing à partir de scripts fonctionne généralement sous Linux/Unix en général et sous Ubuntu en particulier. Je voudrais également connaître un bon moyen pour moi de recevoir des mails dans les deux situations ci-dessus.

46
Deleted

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

La crontab à l'échelle du système se trouve 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. (exécutez "newaliases" après)

La manière normale de structurer ceci est que root soit aliasé à un autre utilisateur du système, par ex. pour moi, je voudrais alias 'root' à 'phil' (mon compte utilisateur) et alias 'phil' à mon adresse e-mail externe.

Si vous avez un cron d'utilisateur spécifique que vous aimeriez vous envoyer par e-mail en sortie, vous pouvez utiliser à nouveau/etc/aliases (à condition que vous ayez un accès superutilisateur) pour rediriger l'utilisateur vers une autre adresse e-mail, ou vous pouvez utiliser ce qui suit sur le haut de votre crontab:

MAILTO="[email protected]"

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

MAILTO=someuser

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

man 5 crontab
62
Philip Reynolds

Afin d'obtenir des e-mails envoyés depuis vixie cron, vous aurez besoin de quelque chose qui reproduit la commande sendmail. L'installation de postfix ou SSMTP triera cette partie. Si vous utilisez postfix, le fichier d'alias peut être utilisé pour mapper les utilisateurs du système à de vraies adresses e-mail.

L'ajout de MAILTO = "[email protected]" en haut d'une crontab provoquera l'envoi par e-mail de toute sortie de la tâche cron. Ceci indépendamment du code d'erreur.

Pour les scripts qui génèrent correctement des erreurs dans STDERR, il est facile de recevoir des e-mails uniquement en cas de problème, procédez comme suit:

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

Cela redirigera uniquement le STDOUT vers null. Si des messages STDERR sont présents, ils vous enverront un e-mail.

Cependant, j'ai trouvé que certains scripts génèrent des erreurs de manière incorrecte en tant que STDOUT et définissent le code de sortie sur 1. Je n'ai pas trouvé de moyen de récupérer la sortie de ceux-ci, mais j'ignore la sortie si le code de sortie est 0. La seule méthode Je peux penser à rediriger la sortie vers un fichier, puis si le code de sortie n'est pas 0, sortir ce fichier pour que cron le saisisse. Cela semble assez horrible.

29
Theozaurus

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

MAILTO="[email protected]"
8
Dan Carley

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

qui enverra tous les messages de cet utilisateur à votre e-mail. si vous ne voulez pas tous les messages, vous pouvez créer un utilisateur spécialement pour cela.

Tant que le script sort quelque chose, vous recevrez un mail.

5
Daniel P

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

3
Low Kian Seong

Je ne pense pas que SSMTP soit à la hauteur de vos besoins. Vous avez besoin de quelque chose qui puisse "recevoir" du courrier provenant 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 du Soleil; Je sais que tous les enfants cool qui utilisent Postfix se moquent de lui ces jours-ci. Votre communauté Ubuntu peut vous guider dans la configuration de votre système de messagerie.

2
David Mackintosh

Une alternative - j'archive tout le courrier racine 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 courrier quotidien à un identifiant de messagerie externe, etc.

2
irdroid3