cron
ya envía la salida estándar y el error estándar de cada trabajo que ejecuta por correo al propietario del trabajo cron.
Puede usar MAILTO=recipient
en el crontab
archivo para enviar los correos electrónicos a una cuenta diferente.
Para que esto funcione, debe tener el correo funcionando correctamente. Por lo general, enviar a un buzón local no es un problema (de hecho, es probable ls -l "$MAIL"
que revele que ya ha estado recibiendo algunos), pero sacarlo de la caja y ponerlo en Internet requiere el MTA (Postfix, Sendmail, qué tiene) estar correctamente configurado para conectarse al mundo.
Si no hay salida, no se generará correo electrónico.
Una disposición común es redirigir la salida a un archivo, en cuyo caso, por supuesto, el demonio cron no verá que el trabajo devuelva ninguna salida. Una variante es redirigir la salida estándar a un archivo (o escribir el script para que nunca imprima nada; tal vez almacena los resultados en una base de datos o realiza tareas de mantenimiento que simplemente no generan nada) y solo recibe un correo electrónico si existe Es un mensaje de error.
Para redirigir ambas secuencias de salida, la sintaxis es
42 17 * * * script >>stdout.log 2>>stderr.log
Observe cómo agregamos (doble >>
) en lugar de sobrescribir, para que la salida de cualquier trabajo anterior no sea reemplazada por la siguiente.
Como se sugiere en muchas respuestas aquí, puede hacer que ambas secuencias de salida se envíen a un solo archivo; reemplace la segunda redirección con 2>&1
para decir "el error estándar debería ir a donde sea que vaya la salida estándar". (Pero no apoyo especialmente esta práctica. Tiene sentido principalmente si realmente no espera nada en la salida estándar, pero puede haber pasado por alto algo, tal vez proveniente de una herramienta externa que se llama desde su script).
cron
los trabajos se ejecutan en su directorio de inicio, por lo que cualquier nombre de archivo relativo debe ser relativo a eso. Si desea escribir fuera de su directorio de inicio, obviamente debe asegurarse por separado de tener acceso de escritura a ese archivo de destino.
Un antipatrón común es redirigir todo a /dev/null
(y luego pedirle a Stack Overflow que lo ayude a descubrir qué salió mal cuando algo no funciona; ¡pero tampoco podemos ver la salida perdida!)
Desde su script, asegúrese de mantener separados los resultados regulares (resultados reales, idealmente en forma legible por máquina) y los diagnósticos (generalmente formateados para un lector humano). En un script de shell,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Algunas plataformas (y, por ejemplo, GNU Awk) le permiten usar el nombre de archivo /dev/stderr
para mensajes de error, pero esto no es adecuadamente portátil; en Perl warn
e die
imprima con error estándar; en Python, escriba sys.stderr
o use logging
; en Ruby, inténtalo $stderr.puts
. Observe también cómo los mensajes de error deben incluir el nombre del script que produjo el mensaje de diagnóstico.