¿Cómo registrar trabajos cron?

218

Quiero saber cómo puedo ver exactamente qué están haciendo los trabajos cron en cada ejecución. ¿Dónde se encuentran los archivos de registro? ¿O puedo enviar la salida a mi correo electrónico? He configurado la dirección de correo electrónico para enviar el registro cuando se ejecuta el trabajo cron pero aún no he recibido nada.

Adrian M.
fuente
Eche un vistazo a esta publicación: Gestión de archivos de registro creados por trabajos cron .
codeforester

Respuestas:

347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

registrará toda la salida del trabajo cron en /var/log/myjob.log

Puede usar mailpara enviar correos electrónicos. La mayoría de los sistemas enviarán crontrabajos no manejados por correo electrónico a la raíz o al usuario correspondiente.

Spliffster
fuente
78
Descripción de lo que significa 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko
55
¿Cuál podría ser el problema si este archivo de registro nunca se crea?
abrazadera
10
FWIW, si quiere ambos stderry stdouten el registro, 2>&1debe venir después de la indirección:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq
2
¿Cómo insertar YYYY-MM-DD_hh-mm-secen el nombre del archivo de salida, para que cada nombre de archivo sea diferente y se mantenga sin reescribir?
Danijel
66
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile
61

De manera predeterminada, cron registra en / var / log / syslog para que pueda ver las entradas relacionadas con cron utilizando:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log

Matthew Lock
fuente
2
En ubuntu 12.04, el valor predeterminado es sin .log, es decir / var / log / syslog
tishma
55
uso journalctl | grep cronen sistemas systemd
Microsoft Linux TM
2
/var/log/cronen AWS Linux AMI.
Jonathan
2
osudo journalctl -u cron
Gianfranco P.
2
Donde exactamente cronse está registrando depende mucho del sistema. Hay una respuesta separada con detalles sobre cómo se configuran varios destinos de registro en sistemas Linux (o más correctamente, sistemas que usan syslog). Otros sistemas pueden tener una forma diferente de configurar estas cosas.
tripleee
10

Aquí está mi código:

* * * * * your_script_fullpath >> your_log_path 2>&1
Haimei
fuente
">>" significa ¿agregar datos a fileright? ¿Qué significa "2> & 1", salida completa con error, verdad?
Nullpointer
3
Las preguntas básicas de redireccionamiento se verifican mejor en el manual. También hay una gran cantidad de preguntas duplicadas sobre estos operadores aquí en Stack Overflow. Pero sí, más o menos; >>agrega y 2>&1dice que envíe un error estándar al mismo lugar que la salida estándar.
tripleee
10

Hay al menos tres tipos diferentes de registro:

  1. El registro ANTES de ejecutar el programa, que solo registra SI el cronjob TRATÓ de ejecutar el comando. Ese se encuentra en / var / log / syslog, como ya lo mencionó @Matthew Lock.

  2. El registro de errores DESPUÉS de que el programa intentó ejecutarse, que puede enviarse a un correo electrónico o a un archivo, como lo menciona @Spliffster. Prefiero iniciar sesión en un archivo, porque con el correo electrónico ENTONCES tienes una NUEVA fuente de problemas, y está comprobando si el envío y la recepción del correo electrónico funcionan perfectamente. A veces lo es, a veces no lo es. Por ejemplo, en una máquina de escritorio común simple en la que no está interesado en configurar un smtp, a veces preferirá iniciar sesión en un archivo:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • También consideraría verificar los permisos de / ABSOLUTE_PATH_TO_LOG y ejecutar el comando desde los permisos de ese usuario. Solo para verificación, mientras prueba si puede ser una fuente potencial de problemas.
  3. El registro del programa en sí, con su propio manejo de errores y registro para fines de seguimiento.

Hay algunas fuentes comunes de problemas con cronjobs: * La RUTA ABSOLUTA del binario que se ejecutará. Cuando lo ejecuta desde su shell, podría funcionar, pero el proceso cron parece usar otro entorno y, por lo tanto, no siempre encuentra archivos binarios si no usa la ruta absoluta. * Las BIBLIOTECAS utilizadas por un binario. Es más o menos el mismo punto anterior, pero asegúrese de que, si simplemente pone el NOMBRE del comando, se refiere exactamente al binario que usa la misma biblioteca, o mejor, verifique si el binario al que se refiere con la ruta absoluta es lo mismo a lo que se refiere cuando usa la consola directamente. Los binarios se pueden encontrar utilizando el comando de localización, por ejemplo:

$locate python

Asegúrese de que el binario al que hará referencia sea el mismo que está llamando en su shell, o simplemente pruebe nuevamente en su shell utilizando la ruta absoluta que planea poner en el cronjob.

  • Otra fuente común de problemas es la sintaxis en el cronjob. Recuerde que hay caracteres especiales que puede usar para listas (comas), para definir rangos (guiones -), para definir incrementos de rangos (barras), etc. Eche un vistazo: http://www.softpanorama.org/Utilities/ cron.shtml
David L
fuente
8

En Ubuntu, puede habilitar un cron.logarchivo que contenga solo las entradas CRON.

Descomente la línea que menciona cronen el /etc/rsyslog.d/50-default.confarchivo:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Guarde y cierre el archivo y luego reinicie el rsyslogservicio:

sudo systemctl restart rsyslog

Ahora puede ver las entradas de registro cron en su propio archivo:

sudo tail -f /var/log/cron.log

Resultados de muestra:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Sin embargo, no verá más información sobre qué scripts se ejecutaron realmente en el interior /etc/cron.dailyo /etc/cron.hourly, a menos que esos scripts dirijan la salida al cron.log (o tal vez a algún otro archivo de registro).

Si desea verificar si se está ejecutando un crontab y no tiene que buscarlo cron.logo syslogcrear un crontab que redirija la salida a un archivo de registro de su elección, algo como:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Pasos tomados de: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/

Gianfranco P.
fuente
Ubuntu 16.04 no mostró ningún registro cron y esta información funcionó.
pojda
5

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=recipienten el crontabarchivo 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>&1para 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).

cronlos 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/stderrpara mensajes de error, pero esto no es adecuadamente portátil; en Perl warne dieimprima con error estándar; en Python, escriba sys.stderro 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.

tripleee
fuente
1

En caso de que esté ejecutando algún comando con sudo, no lo permitirá. Sudo necesita un poco.

Saad Masood
fuente
44
Esto también depende de la sudoconfiguración. Las cosas que deben ejecutarse sin una forma de proporcionar una contraseña deben configurarse NOPASSWD:en su sudoersconfiguración.
tripleee
0

Si aún desea verificar sus trabajos cron, debe proporcionar una cuenta de correo electrónico válida al configurar los trabajos Cron en cPanel.

Cuando especifique un correo electrónico válido, recibirá la salida del trabajo cron que se ejecuta. Por lo tanto, podrá verificarlo y asegurarse de que todo se haya ejecutado correctamente. Tenga en cuenta que no recibirá un correo electrónico si no hay salida del comando cron job.

Tenga en cuenta que recibirá un correo electrónico para cada uno de los trabajos cron ejecutados. Esto puede inundar su bandeja de entrada en caso de que sus cron se ejecuten con demasiada frecuencia

Faridul Khan
fuente