¿Cómo puedo recibir correos electrónicos de cron solo si hay errores?
En la inmensa mayoría de los casos, las tareas funcionarán bien, y realmente no me importa el resultado.
Es solo en el raro caso de una falla que quiero / necesito saber.
Tengo procmail disponible, pero no estoy seguro de si lo que estoy describiendo es posible administrarlo externamente para cron "correctamente".
cron
email
error-handling
madriguera
fuente
fuente
Respuestas:
Como no le interesa la salida, puede redirigir el STDOUT de un trabajo
/dev/null
y dejar que el STDERR se envíe por correo (utilizandoMAILTO
la variable de entorno).Así por ejemplo:
enviará correo cuando haya salida solo en STDERR (con el STDERR), y descartará el STDOUT.
Por supuesto, esto supone que cuando un programa ha escrito en STDERR, ha fallado; Esto podría no ser siempre el caso. Si tiene control sobre el programa, puede hacerlo. Para cualquier caso complejo, debe escribir un contenedor de algún tipo que ejecute los comandos y enviar el correo en consecuencia. Y pon el envoltorio como el
cron
trabajo.fuente
El
chronic
comando de moreutils ejecuta un comando en silencio a menos que falle.Citando de su manual:
fuente
Puede envolver sus invocaciones cron con cronic , un script de shell que come la salida cron a menos que el código de retorno del proceso invocado no sea cero o no haya una salida de error de rastreo.
Para usar cronic, descargue el script en una ubicación adecuada, como
/usr/local/bin
. Sus entradas de crontab deben tener el prefijo de la ruta al script (por ejemplo/usr/local/bin/cronic
), o simplementecronic
, siempre que suPATH
esté configurado correctamente.Tenga en cuenta que "errores" es un término mal definido en su pregunta y requiere una definición cuidadosa. Para que cronic sea útil, debe asegurarse de que los trabajos que envuelve con errores de informe crónico de una de las formas en que define una condición de error. Los métodos implícitos de generación de informes, como escribir cadenas de texto
STDOUT
, requerirán más reflexión para que sea compatible con cronic u otro mecanismo de informes cron.Hay otros contenedores disponibles, como los vinculados desde el sitio crónico:
fuente
cronic
relacionado conchronic
, o es solo una coincidencia?cronic
se implementa en bash,chronic
como se sugiere en la respuesta anterior, es un script de Perl.Aquí hay otra variación que he utilizado con éxito durante muchos años: capturar la salida e imprimirla solo por error . Esto no requiere archivos temporales y conserva toda la salida . La parte importante es la
2>&1
que redirige STDERR a STDOUT.Envíe la salida completa a través de la configuración predeterminada de cron mailer:
Lo mismo pero con una dirección y tema específicos:
Incluso puede realizar múltiples acciones en caso de error y agregar al correo electrónico:
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.fuente
$OUTPUT
entre comillas:"$OUTPUT"
.Probablemente no lo he pensado hasta el final, pero
En casos normales, redirigiría todo a un archivo temporal (probablemente querría usar
mktemp
para obtener un nombre de archivo único), lo eliminaría si el archivo fue exitoso y luegocat
los contenidos nuevamente, si aún existen (es decir, yourthing.sh salió con condición de error), para ser recogido por el programa publicitario cron.Si la memoria funciona, cron ya no envía nada si no hubo salida, por lo que si el archivo de registro está vacío o no existe, no sucede nada. (Redirigimos el mensaje de error).
fuente