Quiero verificar si un determinado crontab funciona correctamente. He añadido 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.
*Edición 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
La sintaxis de la entrada crontab parece correcta. De hecho, si edita su crontab utilizando "crontab -e`" (como debería), obtendrá un error si especifica una entrada crontab sintácticamente inválida de todos modos.
En primer lugar, ¿se ejecuta correctamente "path_to_php_script/info.php" desde la línea de comandos?
Si es así, ¿también se ejecuta correctamente así?:
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)"
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 está teniendo es que el PATH que cron está utilizando para ejecutar su programa es demasiado restrictivo. Por lo tanto, es posible que desee añadir algo como lo siguiente en la parte superior de su entrada crontab (tendrá que añadir los directorios que necesite su script):
PATH=~/bin:/usr/bin/:/bin
También tenga en cuenta que cron utilizará por defecto /bin/sh
, no bash. Si necesita bash, añada también esto al principio de su archivo crontab:
SHELL=/bin/bash
Tenga en cuenta que ambos cambios afectarán a todas las entradas de crontab. Si sólo quieres modificar estos valores para tu programa info.php
, podrías hacer algo así:
*/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 envía a usted por correo electrónico automáticamente. Un sistema de escritorio de Ubuntu por defecto no tendrá configurado el correo local, pero si está trabajando en un servidor puede simplemente escribir "mail" en un terminal para ver todos esos correos crontab. Esto también se aplica al comando "at`".
No redirigir la salida de errores a /dev/null y grep /var/log/syslog para la salida de cron.
grep cron /var/log/syslog
Puede mostrar inmediatamente los errores al guardar un archivo después de editar /etc/crontab
o archivos dentro de /etc/cron.d/
con:
tail -f /var/log/syslog | grep --line-buffered cron
Si la edición está bien, sólo verás el aviso RELOAD
, los errores se producirán como
Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new
Puedes ver tu cron activo con el comando terminal:
crontab -l
Aquí están los parámetros en orden:
min (0 - 59)
hora (0 - 23)
día del mes (1 - 31)
mes (1 - 12)
día de la semana (0 - 6) (domingo=0)
comando
Así pues, está llamando a su script cada primer minuto de cada hora. Deberías probar tu salida en un intervalo más frecuente para probarlo:
* * * * * <command> #Runs every minute
Esto lo llamará cada minuto.