Generador de expresiones cron

Crea horarios de crontab con presets o con los cinco campos de cron y copia la expresión.

Generador de expresiones cron: crontab con ejemplos, próximas ejecuciones y errores comunes

Elige un preset o rellena los cinco campos y el generador monta la expresión cron, la describe en una frase (en inglés) y lista las cinco próximas ejecuciones en tu hora local. También funciona al revés: pega una línea de un crontab o de un CronJob en el cuadro Cron expression y verás qué significa. Los atajos como `@daily` o `@hourly` se convierten a sus cinco campos. Si un valor no es válido, como el minuto 60 o un rango al revés, la herramienta te dice qué campo falla.

Los cinco campos del crontab

Una expresión cron estándar tiene cinco campos separados por espacios. En un crontab, detrás de ellos va el comando que se ejecuta:

┌──────── minuto            0-59
│ ┌────── hora              0-23
│ │ ┌──── día del mes       1-31
│ │ │ ┌── mes               1-12 o jan-dec
│ │ │ │ ┌ día de la semana  0-7 o sun-sat (0 y 7 son domingo)
│ │ │ │ │
* * * * *  /ruta/al/comando

Cada campo acepta * (todos los valores), un número, una lista como 1,15, un rango como 9-17 y un paso como */15 o 0-30/10. Los nombres de meses y días van en inglés y sirven en listas y rangos: mon-fri, jan,jul. El generador acepta todas estas formas y valida los límites de cada campo: 60 * * * * devuelve el error minute must be between 0 and 59, got 60, y 10-5 * * * * avisa de que el rango va hacia atrás.

Cron ejemplos: las programaciones más usadas

* * * * *        cada minuto
*/5 * * * *      cada 5 minutos
*/15 * * * *     cada 15 minutos
0 * * * *        cada hora, en punto
0 */2 * * *      cada 2 horas
0 9 * * *        todos los días a las 09:00
0 9 * * 1-5      de lunes a viernes a las 09:00
30 2 * * 0       los domingos a las 02:30
0 0 1 * *        el día 1 de cada mes a medianoche
0 0 1 1 *        una vez al año, el 1 de enero

Los pasos cuentan desde el inicio del rango, no desde el momento en que instalaste la tarea. */5 en el campo de minutos significa los minutos 0, 5, 10 y así hasta 55 de cada hora. */7 da 0, 7 y así hasta 56, y luego vuelve a 0, de modo que entre el minuto 56 y el 0 de la hora siguiente solo pasan cuatro minutos.

Los atajos @hourly, @daily (o @midnight), @weekly, @monthly y @yearly (o @annually) se pueden pegar en el generador para ver sus cinco campos. @reboot es distinto: no tiene horario, ejecuta la tarea una vez cuando arranca el demonio de cron, y por eso no se puede traducir a una expresión.

La trampa del día del mes y el día de la semana

Cuando restringes los dos campos de día, cron ejecuta la tarea los días que cumplen cualquiera de los dos, no solo los que cumplen ambos. 0 9 1 * 1 no significa «a las 09:00 del día 1 si cae en lunes», sino a las 09:00 del día 1 de cada mes y, además, todos los lunes. El manual de crontab lo explica así, y el generador muestra un aviso en ámbar cuando ambos campos están definidos. Las próximas ejecuciones que lista respetan esa regla.

Para el primer lunes del mes, limita el día del mes a 1-7, deja el día de la semana en * y comprueba el día dentro del comando. La barra antes de % es obligatoria, como se explica más abajo.

0 9 1-7 * * [ "$(date +\%u)" = 1 ] && /usr/local/bin/informe.sh

Por qué un cron job no se ejecuta

Casi siempre el problema es el entorno, no la expresión. Cron lanza los comandos con /bin/sh y un entorno mínimo: el PATH es corto, tu perfil de shell no se carga y el directorio de trabajo es el home del usuario. Un script que funciona en tu terminal puede fallar en cron porque node, php o python3 no están en ese PATH. Usa rutas absolutas o define PATH al principio del crontab.

El carácter % es especial dentro del crontab: sin escapar se convierte en un salto de línea y todo lo que va detrás se pasa al comando por la entrada estándar. Escríbelo como \%, por ejemplo en date +\%F.

Redirige la salida para ver los errores. Sin redirección, la salida se envía por correo al usuario si hay correo configurado y, si no, se pierde.

crontab -e                  # editar tu crontab
crontab -l                  # ver el crontab actual
0 3 * * * tar czf /copias/web-$(date +\%F).tar.gz /var/www >> /var/log/copia.log 2>&1
grep CRON /var/log/syslog   # Debian y Ubuntu: ¿arrancó cron la tarea?
systemctl status cron       # Ubuntu y Debian; en RHEL el servicio es crond

Recuerda también que el crontab del sistema, /etc/crontab, y los archivos de /etc/cron.d llevan un sexto campo con el usuario antes del comando. El crontab personal que editas con crontab -e no lo lleva.

Zonas horarias y cambio de hora

Cron usa la zona horaria del servidor. Una tarea programada a las 09:00 en un servidor en UTC se ejecuta a las 09:00 UTC, diga lo que diga tu portátil. Las próximas ejecuciones del generador se calculan en la zona horaria de tu navegador, así que compáralas con la del servidor ejecutando date o timedatectl allí. Algunas implementaciones, como cronie, admiten la variable CRON_TZ para fijar la zona de la tabla.

El cambio de hora de verano afecta a las tareas programadas en la hora que se salta o se repite, normalmente entre la 01:00 y las 03:00. Una tarea a las 02:30 puede ejecutarse dos veces o ninguna esa noche, según la implementación. Programa lo importante fuera de esa franja o usa UTC en el servidor.

La sintaxis cron en otras herramientas

Los CronJobs de Kubernetes y los workflows programados de GitHub Actions usan los mismos cinco campos. GitHub Actions ejecuta siempre en UTC y no permite intervalos menores de cinco minutos. Kubernetes interpreta el horario en la zona del controlador salvo que indiques spec.timeZone.

Otros planificadores añaden campos. @Scheduled(cron = ...) de Spring y Quartz empiezan con un campo de segundos, y AWS EventBridge usa seis campos que terminan con el año y exige ? en uno de los dos campos de día. Una expresión copiada entre estos sistemas desplaza todos los campos una posición.

Frequently asked questions

¿Cuál es la expresión cron para ejecutar cada 5 minutos?

*/5 * * * * se ejecuta en los minutos 0, 5, 10 y siguientes de cada hora. Para cada 10 minutos usa */10 y para cada 15 minutos, */15.

¿Qué significan los cinco campos de una expresión cron?

Minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12) y día de la semana (0-7, donde 0 y 7 son domingo). Un asterisco significa cualquier valor.

¿Cómo ejecuto un cron job solo de lunes a viernes?

Pon 1-5 en el campo del día de la semana, por ejemplo 0 9 * * 1-5 para las 09:00 de lunes a viernes. Deja el día del mes en *.

¿Cómo veo el crontab en Linux?

crontab -l muestra el crontab de tu usuario y crontab -e lo abre para editarlo. Las tareas del sistema están en /etc/crontab y en los archivos de /etc/cron.d.

¿Por qué mi cron no se ejecuta?

Las causas típicas son un PATH mínimo, rutas relativas en el script, un % sin escapar en el comando y una zona horaria del servidor distinta de la tuya. Redirige la salida a un log con >> archivo.log 2>&1 para ver el error.

¿Qué zona horaria usa cron?

La del servidor donde corre el demonio de cron. GitHub Actions usa UTC, y Kubernetes usa la zona del controlador salvo que definas spec.timeZone.