Registro de TODAS las salidas stderr de crontab en el archivo

12

Por ejemplo, puedo registrar stderrun script de esta manera:

* * * * * run_script.sh > /var/log.txt 2>&1

Pero quiero registrar stderrtodos los scripts en mi crontab. Puedo agregar > /var/log.txt 2>&1a todos los scripts, pero no es bueno si tengo cientos de scripts cron. ¿Hay otra forma más simple de hacer esto?

Maslov Anton
fuente

Respuestas:

6

En crontab, puede configurar MAILTO para que apunte a un alias de correo que ejecute un script. Esa secuencia de comandos aceptaría un mensaje de correo, quitaría los encabezados y otros elementos, y registraría el resto con el registrador. Como toda la salida del script cron se envía a la dirección especificada por MAILTO, capturaría todo.

Ejemplo: en crontab

MAILTO=myalias

En / etc / mail / aliases (suponiendo que esté usando sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

y haga que el script elimine los encabezados de correo y procese la salida cron.

Kyle Jones
fuente
¿puede ser más específico sobre la configuración de MAILTO, alias, MTA, script, etc.?
endolito
1
@endolith He editado la respuesta para dar una configuración básica que debería funcionar para sendmail y MTA ampliamente compatibles. Tendrás que escribir el guión tú mismo.
Kyle Jones el
5

Cualquier salida producida por un comando se envía al usuario especificado en la variable de entorno MAILTO como se establece en el archivo crontab (5) o, si no se establece ninguna variable MAILTO (o si se trata de un trabajo at (1) o batch (1) ), al propietario del trabajo. Si un comando no produce salida o si la variable de entorno MAILTO está configurada en la cadena vacía, no se enviará ningún correo.

Como utiliza el correo local, realmente no necesita configurar nada, o tal vez simplemente instalar mailx si aún no está aquí. Cron le enviará la salida, puede guardar el correo en un archivo y hacer muchas cosas desde allí. Intentar modificar la forma en que cron funciona para satisfacer directamente sus necesidades no es el camino a seguir. Si no lo cree así, solo parche y vuelva a compilar cron, llámelo my_cron y úselo en lugar de cron. Y prepárate para mantener tu my_cron actualizado y reconstruirlo con frecuencia.

Agregue esto al comienzo de todos sus scripts para registrar todo y detenerse en el primer error

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
fuente
¿Debería el orden de redireccionamiento ser el opuesto? > /var/log/YOUR_LOG_FILE 2>&1es decir, primero redirige stdout a un archivo y solo luego redirige stderr a stdout (que ahora apunta al archivo).
jfs
Es una locura que en un servidor mínimo necesite instalar un servicio de correo, y posiblemente un cliente de correo, solo para leer los errores producidos por Cron. Se siente como una decisión de diseño anarquista.
James McMahon
0

El script de Ryan Ye en /programming//a/7145618/20774 también es útil para esto, aunque lo hace tanto stdout como stderr.


Tengo un pequeño script cronlog.sh para hacer esto. El código del script

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Entonces podrías hacer

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Resultado de ejemplo

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
James McMahon
fuente