Formato de crontab: los cinco campos y sus caracteres especiales
Actualizada el 26 de octubre de 2026
En el crontab de un usuario, el que editas con crontab -e, cada job es una línea con un horario de cinco campos, separados por espacios, y después el comando que se ejecuta:
# ┌───────── minuto (0-59)
# │ ┌─────── hora (0-23)
# │ │ ┌───── día del mes (1-31)
# │ │ │ ┌─── mes (1-12)
# │ │ │ │ ┌─ día de la semana (0-7, el domingo es 0 o 7)
# │ │ │ │ │
0 2 * * * /ruta/a/respaldo.sh
Esta línea ejecuta respaldo.sh todos los días a las 2:00: minuto 0, hora 2, cualquier día del mes, cualquier mes y cualquier día de la semana. Las horas son las de la zona horaria del servidor, que puede no ser la tuya (mira cron y las zonas horarias).
Los caracteres especiales
-
*, cualquier valor.*en el campo de la hora significa cada hora. -
,separa una lista.0,30en el campo del minuto se ejecuta en el minuto 0 y en el 30. -
-indica un rango.1-5en el día de la semana se ejecuta de lunes a viernes. -
/indica un paso.*/15en el campo del minuto se ejecuta en los minutos 0, 15, 30 y 45. También sirve con un rango:0-30/10es 0, 10, 20 y 30. -
Nombres. Los meses y los días de la semana también aceptan sus tres primeras letras en inglés, como
JANoMON. Algunas implementaciones no los aceptan en rangos ni listas, así que los números son la opción más segura.
El paso se cuenta dentro de su campo, desde el inicio del rango, y vuelve a empezar en la hora, el día o el mes siguiente. 0 */7 * * * se ejecuta a las 0:00, 7:00, 14:00 y 21:00, y al día siguiente otra vez a las 0:00: tres horas después de la última ejecución, no siete. Del mismo modo, */5 en el día del mes se ejecuta los días 1, 6, 11, 16, 21, 26 y 31, y después el día 1 del mes siguiente.
El día del mes y el día de la semana
Cuando los dos días están restringidos, cron ejecuta el job cuando coincide cualquiera de los dos, no cuando coinciden ambos. 0 0 13 * 5 se ejecuta todos los días 13 y todos los viernes, no solo los viernes 13. Para ejecutarlo un día de la semana solo dentro de algunos días del mes, restringe uno de los dos en el horario y comprueba el otro en el comando:
0 0 1-7 * * [ "$(date +\%u)" = 1 ] && /ruta/a/job.sh
Esa línea se ejecuta el primer lunes del mes: todos los días del 1 al 7, el comando comprueba que sea lunes (date +%u da del 1 al 7, desde el lunes). El % se escribe \% por lo que viene a continuación.
El comando
-
Cron lo ejecuta con
/bin/sh, no con tu shell, y con unPATHcorto. Usa rutas absolutas, o defineSHELLyPATHal principio del crontab (mira por qué tu cron job no se ejecuta). -
%es un salto de línea para cron: lo que va después del primer%pasa a la entrada del comando. Escribe\%para un%en el comando, como endate +\%F. -
La salida se envía por email al usuario del crontab, o a la dirección de
MAILTO. Si el servidor no envía emails, redirígela a un archivo:>> /var/log/job.log 2>&1.
Las otras líneas de un crontab
-
Las líneas que empiezan con
#son comentarios. -
Las variables, como
PATH=/usr/local/bin:/usr/bin:/bin,SHELL=/bin/bashoMAILTO=tu@ejemplo.com, se aplican a las líneas que están debajo. Algunas implementaciones, como cronie, también aceptanCRON_TZpara la zona horaria de los horarios. -
En
/etc/crontaby/etc/cron.d/, cada línea tiene un sexto campo, con el usuario que ejecuta el comando, antes del comando:0 2 * * * root /usr/local/bin/respaldo.sh
Las macros
En lugar de los cinco campos, una línea puede empezar con una de estas:
-
@hourlyes0 * * * *. -
@daily, o@midnight, es0 0 * * *. -
@weeklyes0 0 * * 0, el domingo. -
@monthlyes0 0 1 * *. -
@yearly, o@annually, es0 0 1 1 *. -
@rebootejecuta el comando una vez cuando cron se inicia, normalmente al arrancar el servidor.
Ejemplos
Estas expresiones son solo el horario: el comando va después.
-
* * * * *: cada minuto. -
*/5 * * * *: cada 5 minutos. -
0 * * * *: cada hora, en el minuto 0. -
0 */2 * * *: cada 2 horas. -
0 0 * * *: todos los días a medianoche. -
0 8 * * 1-5: de lunes a viernes a las 8:00. -
0 0 * * 1: todos los lunes, a medianoche. -
0 0 1 * *: el primer día de cada mes. -
30 9-17 * * 1-5: en el minuto 30 de cada hora de 9:00 a 17:00, de lunes a viernes.
No es crontab: segundos y otros formatos
Crontab no tiene un campo para los segundos, así que una línea se ejecuta como mucho una vez por minuto (mira cómo ejecutar un cron job cada pocos segundos). Algunos programadores usan otros formatos:
- Spring y Quartz agregan los segundos como primer campo, y Quartz un séptimo campo con el año. Quartz cuenta los días de la semana desde el domingo como 1.
-
AWS, en las reglas de EventBridge, escribe
cron(0 2 * * ? *): los cinco campos, con un?en uno de los días, y el año al final. Esas reglas se ejecutan en UTC. -
El
CronJobde Kubernetes y GitHub Actions usan los cinco campos de crontab. GitHub Actions los lee en UTC por defecto.
El probador de cron los entiende todos, dice qué significan y da la expresión de crontab que se ejecuta en los mismos minutos.
Compruébalo antes de guardar
Un error en el horario no aparece como un error: el job simplemente se ejecuta a otra hora, o nunca. Pega la expresión en el probador de cron para ver sus próximas ejecuciones en la zona horaria de tu servidor, y configura una alerta para el día en que el job no se ejecute cuando debía.