¿Cómo recibir correo electrónico de trabajos cron (fallidos) en Ubuntu?

45

Creo cron-jobs en Ubuntu colocando el ejecutable en uno de /etc/cron.{daily,hourly,monthly,weekly}. Hay muchos directorios que comienzan con 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

Me gustaría recibir correos electrónicos de mis scripts cuando:

  1. Un script falla y proporciona un código de salida distinto de cero.
  2. El guión tiene algo que decirme

Tengo SSMTP instalado y funcionando, envío mi correo desde mi cuenta de Google. El hecho de que SSMTP solo pueda enviar correo usando una cuenta no es un problema para mí. Es solo un servidor doméstico y los usuarios que tengo no tienen la capacidad de agregar trabajos cron.

Me gustaría saber cómo funciona generalmente el envío de correos desde scripts en Linux / Unix en general y en Ubuntu específicamente. También me gustaría saber una buena manera de recibir correos en las dos situaciones anteriores.

Eliminado
fuente

Respuestas:

60

De manera predeterminada, cron enviará un correo electrónico al propietario de la cuenta en la que se ejecuta el crontab.

El crontab de todo el sistema está en / etc / crontab se ejecuta bajo el usuario 'root'

Debido a que la raíz se usa ampliamente, de todos modos recomendaría agregar un alias raíz a su archivo / etc / aliases. (ejecute 'newaliases' después)

La forma normal de estructurar esto es que la raíz tenga un alias para otro usuario en el sistema, por ejemplo, para mí alias 'root' a 'phil' (mi cuenta de usuario) y alias 'phil' a mi dirección de correo electrónico externa.

Si tiene un cron de usuario específico que le gustaría que le enviemos por correo electrónico en la salida, puede usar / etc / aliases nuevamente (siempre que tenga acceso de superusuario) para redirigir al usuario a otra dirección de correo electrónico, o puede usar lo siguiente en el parte superior de su crontab:

MAILTO="[email protected]"

Si el correo se debe enviar a un usuario local, puede poner solo el nombre de usuario:

MAILTO=someuser

Si necesita más información, vea crontab (5) ejecutando:

man 5 crontab
Philip Reynolds
fuente
¿No se /etc/aliasessupone que las entradas siguen el formato name: value1, value2, ... ? No sé, tal vez el formato se cambió en algún momento en los últimos 8 años.
Nathan Jones
1
"para mí alias 'root' a 'phil' (mi cuenta de usuario) y alias 'phil' a mi dirección de correo electrónico externa". ¿Cómo alias 'phil' a una dirección de correo electrónico externa?
Howard Lee
29

Para recibir correos electrónicos de vixie cron, necesitará algo que reproduzca el comando sendmail. Entonces, la instalación de postfix o SSMTP solucionará esta parte. Si usa postfix, entonces el archivo de alias puede usarse para asignar usuarios del sistema a direcciones de correo electrónico reales.

Agregar MAILTO = "[email protected]" a la parte superior de un crontab hará que se envíe por correo electrónico cualquier salida del trabajo cron. Esto es independientemente del código de error.

Para los scripts que generan errores correctamente en STDERR, es fácil enviarlos por correo electrónico solo cuando salen mal, solo haga esto:

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

Esto redirigirá solo STDOUT a nulo. Si hay algún mensaje STDERR presente, le enviaremos un correo electrónico.

Sin embargo, he encontrado que algunos scripts generarán errores incorrectamente como STDOUT y estableceré el código de salida en 1. No he encontrado una manera de obtener la salida de estos, pero ignoraré la salida si el código de salida es 0. El único método Puedo pensar en redirigir la salida a un archivo, luego, si el código de salida no es 0, ese archivo debe ser capturado por cron. Aunque parece bastante horrible.

Theozaurus
fuente
3
Podría probar habilis.net/cronic
dfrankow
8

Si desea enviar toda la salida (stdout y stderr) a una dirección específica, puede usar la MAILTOvariable. Por ejemplo, coloque lo siguiente en la parte superior del script.

MAILTO="[email protected]"
Dan Carley
fuente
5

intente agregar "root: [email protected]" a / etc / aliases

eso enviará todos los mensajes de ese usuario a su correo electrónico. Si no desea todos los mensajes, puede crear un usuario específicamente para esto.

Mientras el script genere algo, recibirá un correo.

Daniel P
fuente
3

En todos mis servidores de producción que normalmente ejecutan alrededor de 20 cronjobs al día, juro por el paquete python-cronwrap. Compruébalo aquí: http://pypi.python.org/pypi/cronwrap . Es realmente fácil de configurar y, sobre todo, confiable.

Bajo Kian Seong
fuente
2

No creo que SSMTP esté a la altura de lo que necesita hacer. Necesita algo que pueda "recibir" el correo de los procesos cron y luego enviarlo a su buzón real.

Yo uso Sendmail, pero eso es porque soy una vieja mano de Sun; Sé que se burlan de todos los chicos geniales que usan Postfix en estos días. Su comunidad ubuntu puede guiarlo con la configuración de su sistema de correo.

David Mackintosh
fuente
ssmtp implements / bin / sendmail
bobpaul
2

Una alternativa: archivo todo el correo raíz en algunos archivos y luego elimino el correo original.

Cron un script (aquí está la parte clave) -

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

Esto mantiene las cosas ordenadas y puedo vigilarlo. Podría enviar un archivo de correo diario a una identificación de correo electrónico externa, etc.

irdroid3
fuente