Cron: ¿Solo recibe errores en los correos electrónicos?

39

Finalmente configuré un programa de copia de seguridad realista de mis datos a través de un script de shell, que maneja cron en intervalos ajustados. Desafortunadamente, sigo recibiendo correos electrónicos vacíos cada vez que se ejecuta el CRON y no solo cuando las cosas salen mal.

¿Es posible hacer que CRON envíe correos electrónicos cuando algo sale mal, es decir? mi TARno se ejecuta según lo previsto?

Así es como mi crontab está configurado por el momento;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

¡Muchas gracias!

Industrial
fuente

Respuestas:

54

Idealmente, desearía que su script de respaldo no muestre nada si todo sale como se espera y solo produce resultados cuando algo sale mal. Luego use la variable de entorno MAILTO para enviar cualquier salida generada por su script a su dirección de correo electrónico.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

Si su script normalmente produce resultados pero no le importa en cron, simplemente envíelo a / dev / null y le enviará un correo electrónico solo cuando haya algo escrito en stderr.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null
Cakemox
fuente
9
Esto no es ideal. Generalmente desea que se le envíe por correo electrónico toda la salida (stdout + stderr) cuando el comando finaliza con un código de error distinto de cero. De lo contrario, generalmente está bien engullir al menos stdout. Para mí, este es un defecto de diseño de cron.
Witiko
3
@Witiko estoy de acuerdo; Encontré esta pregunta tratando de arreglar eso. ¿Supongo que puedes hacer tu comando cron /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
Daniel H
22

Usar una secuencia de comandos de envoltorio crónico parece una buena idea; para usarlo no tienes que cambiar tus scripts.

En lugar de:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

hacer:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

Simplemente pon; se ejecutará en silencio si todo funciona sin problemas (estado de salida 0), pero informará de forma detallada si no, y dejará que cron maneje los informes de correo.

Más información en https://habilis.net/cronic/ .

Ricardo Pardini
fuente
Realmente no veo cómo eso ayudará cuando el problema no sea más que una línea cron incorrecta y cron esté haciendo exactamente lo que se le dice que haga.
John Gardeniers
3
@JohnGardeniers ayuda porque a veces tienes salida sin error.
Mikhail
11
Alternativamente, chronicdesde el moreutilspaquete: joeyh.name/code/moreutils
Vladimir Panteleev
4

Usted está indicando específicamente cronque siempre envíe un correo electrónico, incluso cuando /bin/backup.sh(por cierto, debería estarlo /usr/local/bin) tenga éxito. Simplemente omita la | mail -s "Backup status" [email protected]parte y el correo electrónico solo se enviará cuando haya salida. Probablemente puede (según su cron) establecer explícitamente la dirección de correo electrónico para enviar como una asignación en el archivo crontab.

Para más detalles, ver

man 5 crontab
reinierpost
fuente
3

Debería dirigir el stderranmd no ambos stdouty stderr.

1> /dev/nullNo use 2>&1y debería estar bien. Además, es posible que deba informar el error correctamente en su script de respaldo.

Khaled
fuente
3

Aquí hay otra variación que he utilizado con éxito durante muchos años: capturar la salida e imprimirla solo por error , activando un correo electrónico. Esto no requiere archivos temporales y conserva toda la salida . La parte importante es la 2>&1que redirige STDERR a STDOUT.

Envíe la salida completa a través de la configuración predeterminada de mailer cron

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

Lo mismo pero con una dirección y tema específicos:

(la dirección también se puede cambiar configurando MAILTO = xxxx para todo el archivo crontab)

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

Incluso puede realizar múltiples acciones en caso de error y agregar al correo electrónico:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

Esto funcionará para comandos simples. Si se trata de tuberías complejas ( find / -type f | grep -v bla | tar something-or-other), es mejor que mueva el comando a un script y ejecute el script utilizando el enfoque mencionado anteriormente. La razón es que si alguna parte de la tubería sale a STDERR, aún recibirá correos electrónicos.

Akom
fuente