Verificar si crontab funciona

82

Quiero verificar si cierto crontab funciona correctamente. He agregado un trabajo como este:

  */2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1

Sé que redirijo al dispositivo nulo, pero no estoy seguro de si el comando anterior es bueno.

* Editar 1: en mi / var / log / syslog cada dos minutos tengo el siguiente error:

 (CRON) error (grandchild #2788 failed with exit status 2)

* Edición 2: no hay errores en los registros con este nuevo trabajo:

 */2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1
croppio.com
fuente
Desafortunadamente, todo lo anterior intentó pero no funciona para mí. como dice la versión de prueba / bin / sh -c "(export PATH = / bin; /tmp/trial.sh </ dev / null)" muestra el siguiente mensaje, no estoy seguro de qué es / bin / sh: PATH = / bin : no es un identificador

Respuestas:

73

La sintaxis para la entrada crontab parece correcta. De hecho, si edita su crontab usando " crontab -e" (como debería), obtendrá un error si especifica una entrada de crontab sintácticamente inválida de todos modos.

  1. En primer lugar, ¿se /path_to_my_php_script/info.phpejecuta correctamente desde la línea de comandos?

  2. Si es así, ¿también funciona correctamente así ?:

    /bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)"
    
  3. Si eso funciona, ¿funciona así?

    /bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"
    

El paso (3) es similar a cómo cron ejecutará su programa (como se documenta en "man 5 cron".

El problema más probable que tiene es que el cron PATH está utilizando para ejecutar su programa es demasiado restrictivo. Por lo tanto, es posible que desee agregar algo como lo siguiente a la parte superior de su entrada de crontab (deberá agregar los directorios que necesite su script):

PATH=~/bin:/usr/bin/:/bin

También tenga en cuenta que cron usará de forma predeterminada /bin/sh, no bash. Si necesita bash, también agregue esto al inicio de su archivo crontab:

SHELL=/bin/bash

Tenga en cuenta que ambos cambios afectarán a todas las entradas de crontab. Si solo desea modificar estos valores para su info.phpprograma, puede hacer algo como esto:

*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"

También vale la pena mencionar que en un sistema configurado para "correo" (en otras palabras, un sistema que tiene un MTA configurado [sendmail / postfix / etc]), toda la salida de los programas crontab se le envía automáticamente por correo electrónico. Un sistema de escritorio Ubuntu predeterminado no tendrá configurado el correo local, pero si está trabajando en un servidor, simplemente puede escribir "mail" en una terminal para ver todos esos correos cron. Esto también se aplica al atcomando " ".

jamesodhunt
fuente
2
Me deniegan el permiso para el segundo paso. ¿Qué tengo que hacer?
akikara
@akikara chmod + x ./cron.sh: obviamente, reemplace ./cron.sh con la ubicación de su archivo que esté intentando ejecutar
Tisch
46

Aunque es muy raro, a veces cron deja de funcionar correctamente aunque el servicio se esté ejecutando. Aquí se explica cómo verificar que crond se está ejecutando y detener / iniciar el servicio.

En Linux:

service crond status
service crond stop
service crond start

En Ubuntu y otros sistemas basados ​​en Debian:

service cron status
service cron stop
service cron start
usuario53817
fuente
13
Sólo una nota ... para Ubuntu es cron, nocrond
Amit Kohli
32

No redirija la salida de error a / dev / null y grep / var / log / syslog para la salida cron.

grep cron /var/log/syslog

Puede mostrar inmediatamente los errores al guardar un archivo después de editarlo /etc/crontabo archivos dentro /etc/cron.d/con:

tail -f /var/log/syslog | grep --line-buffered cron

Si la edición está bien, solo verá el RELOADaviso, se producirán errores como

Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new 
rubiojr
fuente
19

Puedes ver tu cron activo con el comando de terminal:

crontab -l

Aquí están los parámetros en orden:

  1. min (0-59)

  2. hora (0-23)

  3. día del mes (1 - 31)

  4. mes (1-12)

  5. día de la semana (0 - 6) (domingo = 0)

  6. mando

Entonces, estás llamando a tu script cada primer minuto de cada hora. Debe probar su salida en un intervalo más frecuente para fines de prueba:

* * * * * <command> #Runs every minute

¡Esto lo llamará cada minuto!

bioShark
fuente
* / 2 * * * * He cambiado a cada dos minutos ahora
croppio.com
11

Para la parte de tiempo en cada línea, puede usar este probador cron para probar / verificar su definición de tiempo cron.

Ashish Karpe
fuente
Esa es una buena sugerencia.
Rahil Wazir
2
también útil: crontab-generator.org
rubo77
2

Creo que también puedes usar run-partspara ejecutar trabajos cron fuera de banda. En realidad, es lo que cron utiliza para ejecutar los trabajos cron periódicos, por lo que al proporcionar los argumentos apropiados puede ejecutarlos en cualquier momento.

Si solo desea ejecutar un archivo en lugar de todos los trabajos cron definidos en, por ejemplo /etc/cron.daily, deberá proporcionar el argumento regex junto con una expresión regular válida.run-parts --list --regex '^p.*d$' /etc

Tenga en cuenta que los trabajos cron generalmente se nombran sin una extensión y se marcan como ejecutables, así que asegúrese de que sus scripts sean similares, aunque el uso de una expresión regular puede permitirle activar un script con una extensión.

dragon788
fuente
1

ah !!

Obtuve la respuesta, lo comprobé y no encontré cronddentro del directorio de instalación predeterminado, es decir/etc/init.d/

Ahora intentaremos responder.

Nota - comprobé el cron.allow, cron.denytambién. Todo está bien hasta ahora.

suerte
fuente