Pregunta ¿Por qué mi crontab no funciona y cómo puedo solucionarlo?


Esto es un Pregunta canónica sobre el uso de cron y crontab.

Se le ha dirigido aquí porque la comunidad está bastante segura de que la respuesta a su pregunta se puede encontrar a continuación. Si su pregunta no se responde a continuación, las respuestas lo ayudarán a recopilar información que ayudará a la comunidad a ayudarlo. Esta información debe ser editada en su pregunta original.

La respuesta para '¿Por qué mi crontab no funciona y cómo puedo solucionarlo?'se puede ver a continuación. Esto aborda el cron Sistema con el crontab resaltado.


193
2017-11-17 04:51


origen


Este es un gran dupe de Razones por las que el crontab no funciona en AskUbuntu. - Dan Dascalescu


Respuestas:


Cómo solucionar todos sus problemas / problemas relacionados con crontab (Linux)


Esto es un wiki de la comunidadSi nota algo incorrecto con esta respuesta o tiene información adicional, entonces edítelo.


Primero, terminología básica:

  • cron (8) Es el demonio que ejecuta los comandos programados.
  • crontab (1) es el programa usado para modificar los archivos crontab (5) del usuario.
  • crontab (5) es un archivo por usuario que contiene instrucciones para cron (8).

A continuación, la educación sobre cron:

Cada usuario en un sistema puede tener su propio archivo crontab. La ubicación de la raíz y los archivos crontab del usuario dependen del sistema, pero generalmente están debajo de /var/spool/cron.

Hay un sistema de todo el sistema. /etc/crontab archivo, el /etc/cron.d El directorio puede contener fragmentos crontab que también son leídos y ejecutados por cron. Algunas distribuciones de Linux (por ejemplo, Red Hat) también tienen /etc/cron.{hourly,daily,weekly,monthly} que son directorios, scripts dentro que se ejecutarán cada hora / día / semana / mes, con privilegios de raíz.

root siempre puede usar el comando crontab; Los usuarios regulares pueden o no tener acceso. Cuando editas el archivo crontab con el comando crontab -e y guárdelo, crond comprueba su validez básica, pero no garantiza que su archivo crontab esté correctamente configurado. Hay un archivo llamado cron.deny el cual especificará cuales usuarios no pueden usar cron. los cron.deny la ubicación del archivo depende del sistema y se puede eliminar, lo que permitirá a todos los usuarios utilizar cron.

Si la computadora no está encendida o el demonio crond no se está ejecutando, y la fecha / hora para la ejecución de un comando, crond no se recuperará y ejecutará consultas anteriores.

detalles crontab, cómo formular un comando:

Un comando crontab está representado por una sola línea. No puede utilizar \ para extender un comando sobre múltiples lineas. El hash (#) el signo representa un comentario que significa que cualquier cosa en esa línea es ignorada por cron. Los espacios en blanco iniciales y las líneas en blanco se ignoran.

Tenga mucho cuidado al usar el porcentaje (%) firme en su comando. A menos que se escapen \% Se convierten en nuevas líneas y todo después de los primeros no escapados. % se pasa a su comando en stdin.

Hay dos formatos para archivos crontab:

  • Usuario crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • Todo el sistema /etc/crontab y /etc/cron.d fragmentos

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

Tenga en cuenta que este último requiere un nombre de usuario. El comando se ejecutará como el usuario nombrado.

Los primeros 5 campos de la línea representan el (los) tiempo (s) en que se debe ejecutar el comando. Puede usar números o, donde corresponda, los nombres de día / mes en la especificación de tiempo.

  • Los campos están separados por espacios o tabulaciones.
  • Una coma,) se utiliza para especificar una lista, por ejemplo, 1,4,6,8, lo que significa que se ejecuta en 1,4,6,8.
  • Los rangos se especifican con un guión (-) y se puede combinar con listas, p. 1-3,9-12 que significa entre 1 y 3 luego entre 9 y 12.
  • los / el carácter se puede utilizar para introducir un paso, p. 2/5 que significa comenzar a partir de 2 luego cada 5 (2,7,12,17,22 ...). No se envuelven más allá del final.
  • Un asterisco (*) en un campo significa el rango completo para ese campo (por ejemplo, 0-59 para el campo de los minutos).
  • Rangos y pasos se pueden combinar, por ejemplo. */2 significa comenzar por el mínimo para el campo relevante y luego cada 2 e.g. 0 por minutos (0,2 ... 58), 1 por meses (1,3 ... 11) etc.

Depurando comandos cron

¡Revisa el correo! De manera predeterminada, cron enviará cualquier salida del comando al usuario que ejecuta el comando como. Si no hay salida no habrá correo. Si desea que cron envíe un correo a una cuenta diferente, puede configurar la variable de entorno MAILTO en el archivo crontab, por ejemplo.

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

Captura la salida tú mismo

1 2 * * *  /path/to/your/command &>/tmp/mycommand.log

que captura stdout y stderr a /tmp/mycommand.log

Mira los registros; cron registra sus acciones a través de syslog, que (dependiendo de su configuración) a menudo va a /var/log/cron o /var/log/syslog.

Si es necesario, puede filtrar las declaraciones cron con, por ejemplo,

grep CRON /var/log/syslog 

Ahora que hemos analizado los conceptos básicos de cron, dónde están los archivos y cómo usarlos, veamos algunos problemas comunes.

Compruebe que cron se está ejecutando

Si cron no se está ejecutando, sus comandos no serán programados ...

ps -ef | grep cron | grep -v grep

debería conseguirte algo como

root    1224   1  0 Nov16 ?    00:00:03 cron

o

root    2018   1  0 Nov14 ?    00:00:06 crond

Si no reiniciarlo

/sbin/service cron start

o

/sbin/service crond start

Puede haber otros métodos; Usa lo que tu distro provee.

cron ejecuta su comando en un entorno restringido.

Es probable que las variables de entorno disponibles sean muy limitadas. Por lo general, solo obtendrá unas pocas variables definidas, como $LOGNAME, $HOMEy $PATH.

De particular interés es el PATH está restringido a /bin:/usr/bin. La gran mayoría de los problemas de "mi secuencia de comandos cron no funciona" se deben a esta ruta restrictiva. Si su comando está en una ubicación diferente, puede resolverlo de varias maneras:

  1. Proporcione el camino completo a su comando.

    1 2 * * * /path/to/your/command
    
  2. Proporcionar un PATH adecuado en el archivo crontab

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

Si su comando requiere otras variables de entorno, también puede definirlas en el archivo crontab.

cron ejecuta su comando con cwd == $ HOME

Independientemente de dónde se encuentre el programa que ejecute en el sistema de archivos, el directorio de trabajo actual del programa cuando se ejecute cron será directorio de inicio del usuario. Si accede a los archivos en su programa, deberá tener esto en cuenta si usa rutas relativas, o (preferiblemente) simplemente use rutas completamente calificadas en todas partes, y guarde a todos una gran confusión.

El último comando en mi crontab no se ejecuta

Cron generalmente requiere que los comandos terminen con una nueva línea. Edita tu crontab; vaya al final de la línea que contiene el último comando e inserte una nueva línea (presione enter).

Compruebe el formato crontab

No puede usar un usuario crontab con formato crontab para / etc / crontab o los fragmentos en /etc/cron.d y viceversa. Un crontab con formato de usuario no incluye un nombre de usuario en la sexta posición de una fila, mientras que un crontab con formato de sistema incluye el nombre de usuario y ejecuta el comando como ese usuario.

Puse un archivo en /etc/cron.{hourly,daily,weekly,monthly} y no se ejecuta

  • Comprueba que el nombre del archivo no tenga extensión. partes de carrera
  • Asegúrese de que el archivo tiene permisos de ejecución.
  • Dígale al sistema qué usar al ejecutar su script (por ejemplo, poner #!/bin/sh hasta arriba)

Cron data errores relacionados

Si un usuario o una actualización del sistema, una zona horaria u otro cambiaron su fecha, crontab comenzará a comportarse de forma errática y mostrará errores extraños, a veces funcionando, a veces no. Este es el intento de crontab de intentar "hacer lo que quieres" cuando el tiempo cambia por debajo de él. El campo de "minutos" se volverá ineficaz después de que se cambie la hora. En este escenario, solo se aceptarían asteriscos. Reinicie cron y vuelva a intentarlo sin conectarse a Internet (de modo que la fecha no tenga la oportunidad de restablecerse en uno de los servidores de hora).

Signos de porcentaje, de nuevo

Para enfatizar el consejo sobre los signos de porcentaje, aquí hay un ejemplo de lo que hace cron con ellos:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

creará el archivo ~ / cron.out que contiene las 3 líneas

foo
bar
baz

Esto es particularmente intrusivo cuando se usa el date mando. Asegúrate de escapar de los signos de porcentaje

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

273
2017-10-09 15:29



Es posible que desee mencionar también en la sección "contenido restringido" que LD_LIBRARY_PATH también puede necesitar que se establezca un directorio adicional en caso de que su tarea cron esté fallando debido a que no puede encontrar bibliotecas compartidas. - DavidJ
tenga en cuenta que incluso puede escribir algo como esto: 35 1,5-23 / 2 * * * do_algo en lugar de 35,1,5,7,9, .. * * * Además, esto crontab.guru traduce las entradas que haces al lenguaje humano. - Dennis Nolte
La captura de salida no funciona para mí, puede ser debido a la shell sh. Creo que esto es más portátil: ... /path/to/your/command >/tmp/mycommand.log 2>&1 - chus
esto funcionó para mí: sudo apt-get install postfix - jmunsch
¿El trabajo cron también depende de qué tan pesado es el archivo? Porque ejecuté el simple hello world en python con cron, funcionó. Pero mi segundo código fue un poco pesado y normalmente se ejecuta, pero con cron no está dando salida al archivo. - Devendra Bhat


Si sus cronjobs dejan de funcionar, verifique que su contraseña no haya caducado, ya que una vez que la tiene, todos los trabajos cron se detendrán.
Habrá mensajes en /var/log/messages similar a la siguiente que muestra problemas con la autenticación del usuario:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


18
2018-02-04 20:29



Acabo de recibir esto también (archivo de mensaje de error / var / log / syslog para mí). En mi caso, una caja de DigitalOcean que, en el momento de la creación, restablecen la contraseña de root (opcionalmente) a otra, y aparentemente hasta que ingresas y la cambias, no se ejecutan todos los trabajos cron. Gorrón. Arreglar es algo como sudo -u root passwd - rogerdpack


Debian Linux y su derivado (Ubuntu, Mint, etc.) tienen algunas peculiaridades que pueden impedir que se ejecuten sus trabajos cron; en particular, los archivos en /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly} debe :

  • ser propiedad de root
  • solo se puede escribir por root
  • No se puede escribir por grupo u otros usuarios
  • tener un nombre sin ningún punto ''. o cualquier otro carácter especial pero '-' y '_'.

El último duele regularmente a los usuarios desprevenidos; en particular, cualquier secuencia de comandos en una de estas carpetas nombradas whatever.sh, mycron.py, testfile.pl, etc. no ser ejecutado, nunca.

En mi experiencia, este punto en particular ha sido, con mucho, la razón más frecuente para un trabajo no programado en Debian y sus derivados.

Ver man cron Para más detalles, si es necesario.


15
2017-11-17 14:37





Horarios poco frecuentes e irregulares.

Cron se considera todo como un planificador muy básico y la sintaxis no permite fácilmente que un administrador formule cronogramas poco comunes.

Considere el siguiente trabajo que comúnmente se explicaría a "correr command cada 5 minutos ":

*/5 * * * * /path/to/your/command

versus:

*/7 * * * * /path/to/your/command

cual no siempre correr command cada 7 minutos.

Recuerda que el / el carácter se puede usar para introducir un paso, pero esos pasos no se ajustan más allá del final de una serie, por ejemplo, */7 que coincide cada 7 minutos a partir de los minutos 0-59  es decir, 0,7,14,21,28,35,42,49,56 pero entre una hora y la siguiente habrá solo 4 minutos entre lotes, después 00:56 una nueva serie comienza en 01:00, 01:07 etc. (y los lotes no se ejecutarán en 01:03 , 01:10 , 01:17 etc.).


¿Qué hacer en su lugar?

Crear múltiples lotes

En lugar de un solo trabajo cron, cree varios lotes que combinen el resultado en la programación deseada.

Por ejemplo, para ejecutar un lote cada 40 minutos (00:00, 00:40, 01:20, 02:00, etc.) cree dos lotes, uno que se ejecuta dos veces en las horas pares y el segundo que se ejecuta solo las horas impares:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

Ejecute sus lotes con menos frecuencia 

En lugar de ejecutar su lote cada 7 minutos, que es un programa difícil de dividir en varios lotes, simplemente ejecútelo cada 10 minutos.

Ejecuta tus lotes con más frecuencia 

Muchas programaciones impares evolucionan porque los tiempos de ejecución de los lotes aumentan / fluctúan y luego los lotes se programan con un poco de margen de seguridad adicional para evitar que las ejecuciones posteriores del mismo lote se superpongan y se ejecuten simultáneamente.

En su lugar, piense de manera diferente y cree un cronjob que fallará correctamente cuando una ejecución anterior aún no haya terminado, pero que se ejecutará de otra manera. Mira esto Preguntas y respuestas:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job --minutely

En una nota similar, puede dejar que registre por lotes la marca de tiempo de la última ejecución exitosa y al inicio de la verificación de lotes si el intervalo deseado entre los lotes ya ha pasado y se ejecuta y, de lo contrario, salga correctamente.

En bash el seven-minute-job se vería algo así como algo como:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
    echo "The minimum interval of 7 minutes between successive batches hasn't passed yet."
    exit
fi

echo "Start running your batch"

date > /tmp/lastrun

Que luego puede con seguridad (intentar) ejecutar cada minuto:

* * * * * /path/to/your/seven-minute-job

No uses cron

Si sus necesidades son complejas, podría considerar usar un producto más avanzado que esté diseñado para ejecutar programas complejos (distribuidos en varios servidores) y que admita disparadores, dependencias de trabajo, manejo de errores, monitoreo de reintentos, etc. La jerga de la industria sería "empresarial" horario de trabajo y / o "automatización de la carga de trabajo".


10
2017-10-23 04:45





PHP-específico

Si tienes algún trabajo cron como:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

Y en caso de errores, espere que se los envíen, pero no lo hacen, verifique esto.

PHP por defecto no envía errores a STDOUT. @ver https://bugs.php.net/bug.php?id=22839

Para solucionar esto, agregue cli`s php.ini o en su línea (o en su envoltorio de bash para PHP) estos:

  • --define display_startup_errors = 1
  • --define display_errors = 'stderr'

El primer ajuste le permitirá tener elementos fatales como 'Memoria oops' y el segundo - para redirigirlos a STDERR. Solo después de que pueda dormir bien, todo se enviará al correo de su raíz en lugar de solo registrarse.


8



Ese informe de error se cerró en 2007 con el estado del parche que se agregó a las sucursales de PHP 5.2+. ¿Estás seguro de que esto es necesario? Acabo de probar PHP 5.4 y parece que funciona bien. (Todavía es necesario para PHP 4 aunque). - Xeoncross
@Xeoncross ver fecha de respuesta :) - gaRex
Sí, eso es lo que me confundió ya que respondiste en 2013 y el boleto estaba en 2007. - Xeoncross