2009-09-08 4 views
18

Tengo algunos scripts de Python que se ejecutan diariamente en cron. ¿Cómo puedo hacer que cron me envíe un correo electrónico SOLAMENTE CUANDO HAY STDERR OUTPUT de mi script? Quiero poder enviar varios destinatarios por correo y configurar la línea de asunto individualmente para cada entrada de cron.¿Cron envía un correo electrónico con STDERR pero NO ESTÁ CERRADO?

yo probamos este:

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

pero no funcionó - sigo recibiendo mensajes de correo electrónico en blanco cuando no hay STDERR. ¿Debo hacer esto en el script en sí?

Lo siento si esto parece básico, he buscado mucho pero parece que esto no me ha respondido de manera sucinta.

Respuesta

8

La prueba de archivo -s le dirá si un archivo existe y tiene un tamaño mayor que cero.

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

Terminé usando una variante de este enfoque. Gracias mobrule – g33kz0r

+0

encontré un buen artículo sobre esto que me ayudó .. http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ – ishan

23

Para cron no necesita pasar por el correo. El cron daemon automáticamente enviará cualquier resultado de su comando. Su entrada en el crontab debe verse como:

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

Si no hay salida STDERR, no recibirá ningún correo.

+1

"Si no hay salida STDERR, no recibirá ningún correo". Eso es cierto, si configuro MAILTO = "me @ mine". Sin embargo, NO es cierto si la tubería se envía por correo (1). "Además de LOGNAME, HOME y SHELL, cron mirará MAILTO si tiene algún motivo para enviar correo como resultado de ejecutar comandos en 'este' crontab." - http://ss64.com/osx/crontab.html Sin embargo, tengo que configurar el _sujeto_ del correo, y no hay manera de hacer esto (en mi humilde opinión) con cron sí mismo. Así que estoy atascado usando el correo, que nos devuelve a mi pregunta original. – g33kz0r

+1

El problema con este enfoque es que asume que 'stdout' no contendrá ninguna información útil en caso de error.La solución 'cronic' funcionó mejor para mí. –

12

electrónico v1.6 tiene una opción para no enviar mensajes con un cuerpo vacío:

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

Esto podría ser lo que usted está buscando.

15

Usted está formulando la pregunta incorrecta. Cuando está utilizando el correo (1) para enviar el correo electrónico, ya no es relevante que esté en cron. Lo que realmente necesita es conectar stderr a stdin de correo. tubería normal es desde la salida estándar a la entrada estándar, por lo que forma más sencilla de resolver esto es redirigir:

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

o de la manera menos clara debido a la orden confusa de redirectings:

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

+1

Gran respuesta y la técnica adecuada para dirigir tanto stderr como stdout al comando de correo. El segundo ejemplo suelta stdout en el suelo y solo envía stderr al comando de correo. –

+0

Creo que esa fue la intención. –

8

Hay es una buena herramienta llamada cronic que hace esto. Es parte del paquete moreutils.

+2

En mi Ubuntu 12.04, es '' chronic'' (no '' cronic'') que está incluido en '' moreutils'', está escrito en perl en lugar de bash, pero parece tener el mismo propósito. Gracias de cualquier manera ! – vaab

+1

'chronic' parece emitir STDOUT y STDERR si el programa sale con un error, o ninguno si el programa sale limpiamente. Eso no funcionó para mí. Quería un 'crónica' que filtrara STDOUT, independientemente del código de salida. Una simple redirección funcionó mejor para mí. – richardkmiller

+1

Tenga en cuenta que el comportamiento de 'cronic' y' chronic' es diferente: 'chronic' (' moreutils', Perl) no genera nada si el código de salida es 0, incluso si había algo en STDERR. 'cronic' ([habilis.net] (http://habilis.net/cronic/), bash) da salida a todo si había algo en STDERR, incluso si el código de salida es 0. – Qtax

-2

Si su SCRIPT tiene comandos que pueden producir STDERR que desea que se le notifique, entonces debe usar una llamada de correo o mailx dentro de la secuencia de comandos (si no, else o). Los trabajos de cron STDOUT y STDERR son solo para la tarea cron EJECUCCION STDOUT y STDERR. hkmaly tenía razón en el n

+3

entonces ¿por qué no vota la respuesta de hkmalys? ? esto no agrega nada – g33kz0r

Cuestiones relacionadas