2009-09-08 12 views
18

J'ai des scripts python qui s'exécutent tous les jours dans cron. Comment puis-je avoir cron m'envoyer un e-mail SEULEMENT QUAND IL EST STDERR OUTPUT de mon script? Je souhaite pouvoir envoyer plusieurs destinataires par courrier et définir la ligne d'objet individuellement pour chaque entrée cron.Cron envoyer un e-mail avec STDERR mais pas STDOUT?

J'ai essayé ceci:

./prog > /dev/null | mail . . . 

mais il ne fonctionne pas - je reçois encore des e-mails vides quand il n'y a pas STDERR. Ai-je besoin de faire cela dans le script lui-même?

Désolé si cela semble basique, j'ai beaucoup googlé mais je n'arrive pas à trouver cette réponse succintement.

Répondre

8

Le test de fichier -s vous dira si un fichier existe et a une taille supérieure à zéro.

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi 
+0

J'ai fini par utiliser une variante de cette approche. Merci mobrule – g33kz0r

+0

trouvé un bon article sur ce qui m'a aidé .. http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ – ishan

23

Pour cron, vous n'avez pas besoin de passer par le courrier. Le démon cron enverra automatiquement toute sortie de votre commande à vous. Votre entrée crontab devrait ressembler à:

# every minute 
* * * * * ./prog >/dev/null 

S'il n'y a pas de sortie de STDERR, vous ne recevrez aucun courrier.

+1

"S'il n'y a pas de sortie STDERR, vous n'obtiendrez aucun courrier." C'est vrai, si je mets MAILTO = "me @ mine". Cependant, ce n'est PAS vrai si le tuyau passe à la poste (1). "En plus de LOGNAME, HOME, et SHELL, cron regardera MAILTO s'il a des raisons d'envoyer du courrier suite à l'exécution de commandes dans' this 'crontab. " - http://ss64.com/osx/crontab.html Cependant, j'ai besoin de définir le _subject_ du mail, et il n'y a aucun moyen de le faire (IMHO) avec cron lui-même. Donc, je suis coincé en utilisant le courrier, ce qui nous ramène à ma question initiale. – g33kz0r

+1

Le problème avec cette approche est qu'elle suppose que 'stdout' ne contiendra aucune information utile en cas d'erreur.La solution 'cronic' a mieux fonctionné pour moi. –

12

courrier v1.6 a une possibilité de ne pas envoyer des messages avec un corps vide:

-E  Do not send messages with an empty body. 
     This is useful for piping errors from cron(8) scripts. 

Cela pourrait être ce que vous recherchez.

15

Vous posez une question incorrecte. Lorsque vous utilisez mail (1) pour envoyer l'email, il n'est plus pertinent que son cron. Ce dont vous avez réellement besoin est de rediriger stderr vers stdin of mail. conduite normale est de stdout à stdin, donc plus simple pour résoudre ce problème est redirect:

{ /prog > /dev/null ; } 2>&1 | mail ...

Ou de la façon moins claire en raison de l'ordre confus de redirectings:

/prog 2>&1 > /dev/null | mail ...

+1

Grande réponse et la bonne technique pour diriger à la fois stderr et stdout vers la commande mail. Le second exemple supprime stdout sur le sol et envoie uniquement stderr à la commande mail. –

+0

Je pense que c'était l'intention. –

8

Il est un bel outil appelé cronic qui fait cela. Il fait partie du paquet moreutils.

+2

Sur mon Ubuntu 12.04, c'est '' chronic'' (pas '' cronic'') qui est inclus dans '' moreutils'', il est écrit en perl plutôt que bash, mais semble avoir le même but. Merci quand même ! – vaab

+1

'chronic' semble sortir à la fois STDOUT et STDERR si le programme se termine avec une erreur, ou si le programme se termine proprement. Cela n'a pas fonctionné pour moi. Je voulais un "chronique" qui filtre STDOUT, indépendant du code de sortie. Une simple redirection a mieux fonctionné pour moi. – richardkmiller

+1

Notez que le comportement de 'cronic' et' chronic' est différent: 'chronic' (' moreutils', Perl) ne produit rien si le code de sortie est 0, même s'il y avait quelque chose sur STDERR. 'cronic' ([habilis.net] (http://habilis.net/cronic/), bash) sort tout s'il y avait quelque chose sur STDERR, même si le code de sortie est 0. – Qtax

-2

Si votre SCRIPT contient des commandes susceptibles de produire STDERR sur lesquelles vous souhaitez recevoir une notification, vous devez utiliser un appel mail ou mailx dans le script lui-même (si autrement ou). Les redirections STDOUT et STDERR du travail cron sont UNIQUEMENT pour le travail cron EXECUTION STDOUT et STDERR. hkmaly avait le droit sur le n

+3

alors pourquoi ne pas upvote hkmalys répondre ? cela n'ajoute rien – g33kz0r

Questions connexes