2011-02-03 24 views
23

He agregado una entrada crontab en un servidor Linux que ejecutará un ejecutable Java. El código de Java usa su propia clase para registrar errores y mensajes en un archivo de registro.Depuración de trabajos crontab

Pero cuando revisé el archivo de registro después de la hora programada, no se registraron mensajes. Debería haber al menos un mensaje de registro que dijera que la ejecución había comenzado.

Así que hay dos causas posibles:

  1. El código ejecutado pero no registraba;
  2. O, el código no se ejecutó en absoluto.

El archivo de registro especificado tiene chmod 777 permisos, así que supongo que es la segunda causa aquí.

¿Por qué no se ejecutaría una tarea de crontab a la hora programada? ¿Y cómo puedo depurar esto sin que ocurra ningún tipo de registro?

He leído que si hay un error, cron envía un correo electrónico al usuario. ¿Cómo averiguo qué dirección de correo electrónico está asociada con el usuario?

Respuesta

23

Adjuntar 2> & 1 al final de su comando Crontab. Esto redireccionará la salida stderr a stdout. Luego, asegúrese de estar registrando el comando Unix de crontab.

0 0,12 1 */2 * /sbin/ping -c 192.168.0.1; ls -la >>/var/log/cronrun 2>&1 

Esto capturará cualquier cosa del comando de Unix.

Un par de pistas adicionales (después de ayudar a un colega el otro día ...). Escriba las variables de entorno emitiendo el conjunto de comandos sin parámetros. Y haz que el shell repita cada comando con el comando set -x. En la parte superior de tu problema de script;

set 
set -x 
+0

que aún no funciona guarda nada. El comando crontab es '25 08 * * * /root/java/MyProject/sync.sh >> /root/java/Migration/sync.log 2> & 1'. Sin embargo, si ejecuto el script de shell, entonces el código se ejecuta y la clase Java Logger escribe en el archivo de registro – naiquevin

+0

¿Está configurando variables de entorno en el script? A menudo, si una secuencia de comandos se ejecuta desde la línea de comandos pero no desde cron, puede ser un entorno. tener synch.sh escribir su salida env al registro. – Karl

+0

¿Qué variables necesitaré establecer? Probé el comando 'env' desde la terminal y no muestra ni JAVA_HOME ni CLASSPATH. Este es el servidor en vivo donde acabo de instalar JRE y no JDK. Gracias – naiquevin

0

Compruebe si realmente ha formateado el tiempo cuando tiene que funcionar bien.

Por ejemplo en lugar de

*/1 * * * * echo 'debug' > /home/glab/change_branch.log 

podría ser la siguiente:

1 * * * * echo 'debug' > /home/glab/change_branch.log 

y usted podría estar esperando que se ejecute cada minuto. Y tampoco se generan registros.

0

Una cosa que puede estar causando su problema es que cron (al menos en la distribución que estoy usando, Amazon Linux OS) considera los tiempos en UTC, por lo tanto, si se encuentra en una zona horaria diferente (por ejemplo, -03: 00) puede esperar que se ejecute con 3 horas de anticipación de que realmente lo hará y, de hecho, no tiene ningún problema.

23

Puede habilitar el registro para tareas cron para rastrear problemas.Hay que editar el /etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf (en Ubuntu) de archivos y asegúrese de que tiene la siguiente línea sin comentar o añadirlo si no se encuentra:

cron.*       /var/log/cron.log 

continuación, reinicie rsyslog y cron:

sudo service rsyslog restart 
sudo service cron restart 

trabajos Cron se registrará en /var/log/cron.log.

0

Suponiendo que ejecutar el comando funciona manualmente, pero no en Cron, es posible que la ruta correcta no esté expuesta al comando cron. Puede solucionar este problema mediante la ejecución de crontab -e y luego entrar en la ruta directamente en la pestaña de cron:

# Export the path so that the scripts run correctly PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin