Expresiones Cron Explicadas: Guía Completa de Sintaxis
· 12 min de lectura
📑 Tabla de Contenidos
- Anatomía de una Expresión Cron
- Los Cinco Campos en Detalle
- Caracteres Especiales Explicados
- Patrones Cron Comunes
- Patrones de Programación Avanzados
- Trabajando con Crontab
- Consideraciones de Zona Horaria
- Depuración de Trabajos Cron
- Mejores Prácticas y Errores Comunes
- Herramientas de Prueba y Validación
- Preguntas Frecuentes
- Artículos Relacionados
Cron es el programador de tareas basado en tiempo en sistemas operativos tipo Unix. Si necesitas ejecutar un script a medianoche, respaldar una base de datos cada domingo, limpiar archivos temporales cada hora, o enviar informes el primer día de cada mes, cron es tu herramienta. Pero su sintaxis de expresiones — esas cadenas crípticas como 0 */6 * * 1-5 — pueden ser intimidantes al principio.
Esta guía desmitifica completamente las expresiones cron. Aprenderás cada campo, cada carácter especial, verás docenas de patrones del mundo real, y entenderás las trampas de zona horaria que confunden incluso a desarrolladores experimentados. Ya sea que estés programando respaldos, ejecutando scripts de mantenimiento, o automatizando informes, dominar la sintaxis cron es esencial para cualquier desarrollador o administrador de sistemas.
Anatomía de una Expresión Cron
Una expresión cron estándar tiene cinco campos separados por espacios. Cada campo representa una unidad de tiempo, y juntos definen exactamente cuándo debe ejecutarse tu tarea.
┌───────────── minuto (0-59)
│ ┌─────────── hora (0-23)
│ │ ┌───────── día del mes (1-31)
│ │ │ ┌─────── mes (1-12)
│ │ │ │ ┌───── día de la semana (0-6, Dom=0)
│ │ │ │ │
* * * * * comando a ejecutar
Cada campo puede contener un número, un rango, una lista, un valor de paso, o un comodín. La belleza de cron es que estos simples bloques de construcción se combinan para crear patrones de programación increíblemente flexibles.
Algunas implementaciones de cron soportan un sexto campo para segundos, y un séptimo para año, pero el formato estándar de cinco campos es universalmente soportado y lo que encontrarás en la mayoría de sistemas tipo Unix incluyendo Linux, macOS, y variantes BSD.
Los Cinco Campos en Detalle
Entender el rango y comportamiento de cada campo es crucial para escribir expresiones cron correctas. Examinemos cada uno sistemáticamente.
| Campo | Rango | Caracteres Especiales | Ejemplo |
|---|---|---|---|
| Minuto | 0-59 | * , - / | */15 (cada 15 min) |
| Hora | 0-23 | * , - / | 9-17 (9 AM a 5 PM) |
| Día del Mes | 1-31 | * , - / L W | 1,15 (1 y 15) |
| Mes | 1-12 o ENE-DIC | * , - / | 1-6 (Ene a Jun) |
| Día de la Semana | 0-6 o DOM-SAB | * , - / L # | 1-5 (Lun a Vie) |
Campo Minuto (0-59)
El campo minuto controla en qué minuto de la hora se ejecuta tu tarea. Un valor de 0 significa el inicio de la hora, 30 significa media hora, y 59 es el último minuto de la hora.
Los patrones comunes incluyen */5 para cada 5 minutos, 0,30 para dos veces por hora, o 15 para un cuarto de hora cada hora.
Campo Hora (0-23)
Las horas usan formato de 24 horas donde 0 es medianoche, 12 es mediodía, y 23 es 11 PM. Esta es una de las fuentes más comunes de confusión para desarrolladores acostumbrados a la notación de 12 horas AM/PM.
Las horas de oficina típicamente se representan como 9-17 (9 AM a 5 PM), mientras que el mantenimiento nocturno podría usar 0-6 (medianoche a 6 AM).
Campo Día del Mes (1-31)
Este campo especifica qué día del mes ejecutar. Los valores válidos son 1 hasta 31, aunque no todos los meses tienen 31 días. Cron maneja esto elegantemente — si especificas el día 31 en febrero, la tarea simplemente no se ejecutará ese mes.
El carácter especial L significa "último día del mes" y se ajusta automáticamente para la longitud del mes y años bisiestos.
Campo Mes (1-12)
Los meses pueden especificarse numéricamente (1 para enero hasta 12 para diciembre) o usando abreviaturas de tres letras (JAN, FEB, MAR, etc.). Las abreviaturas no distinguen mayúsculas en la mayoría de implementaciones.
Los horarios trimestrales a menudo usan patrones como 1,4,7,10 (enero, abril, julio, octubre) o 3,6,9,12 para finales de trimestre fiscal.
Campo Día de la Semana (0-6)
Los días de la semana van desde 0 (domingo) hasta 6 (sábado). Algunos sistemas también aceptan 7 como domingo por conveniencia. También se soportan abreviaturas de tres letras (SUN, MON, TUE, etc.).
El patrón más común es 1-5 para días laborables (lunes a viernes), mientras que 0,6 o 6,0 representa fines de semana.
Consejo profesional: Cuando tanto el día del mes como el día de la semana están especificados (no comodines), la tarea se ejecuta cuando cualquiera de las condiciones se cumple (lógica OR), no ambas. Esto sorprende a muchos desarrolladores. Por ejemplo, 0 0 13 * 5 se ejecuta el día 13 de cada mes y cada viernes, no solo viernes 13.
Caracteres Especiales Explicados
Los caracteres especiales son lo que le dan a las expresiones cron su poder y flexibilidad. Cada carácter sirve un propósito específico en la definición de patrones de programación.
Asterisco (*) - Comodín
El asterisco significa "cada valor posible" para ese campo. Es el carácter especial más comúnmente usado y aparece en casi todas las expresiones cron.
* * * * *— Ejecutar cada minuto de cada día0 * * * *— Ejecutar al inicio de cada hora0 0 * * *— Ejecutar a medianoche cada día
Coma (,) - Separador de Lista
Las comas te permiten especificar múltiples valores discretos. Esto es perfecto cuando necesitas tiempos específicos, no consecutivos.
0 9,12,15,18 * * *— Ejecutar a las 9 AM, mediodía, 3 PM, y 6 PM0 0 1,15 * *— Ejecutar a medianoche el 1 y 15 de cada mes0 0 * * 1,3,5— Ejecutar a medianoche los lunes, miércoles, y viernes
Guion (-) - Operador de Rango
Los guiones definen rangos inclusivos, facilitando especificar períodos continuos.
0 9-17 * * *— Ejecutar cada hora de 9 AM a 5 PM0 0 * * 1-5— Ejecutar a medianoche de lunes a viernes0 0 1-7 1 *— Ejecutar diariamente durante la primera semana de enero
Barra (/) - Valores de Paso
La barra especifica intervalos de paso, permitiéndote ejecutar tareas a intervalos regulares dentro de un rango. La sintaxis es inicio/paso o */paso para el rango completo.
*/15 * * * *— Cada 15 minutos (0, 15, 30, 45)0 */2 * * *— Cada 2 horas (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)0 0 */3 * *— Cada 3 días (1, 4, 7, 10, etc.)0 9-17/2 * * *— Cada 2 horas entre 9 AM y 5 PM (9, 11, 13, 15, 17)
Consejo rápido: */15 no significa "cada 15 minutos comenzando ahora" — significa en los minutos 0, 15, 30, y 45 de cada hora. Si agregas una tarea cron a las 10:07, un patrón */15 se ejecutará primero a las 10:15, no a las 10:22.
L - Último Día
El carácter L significa "último" y se usa en los campos de día del mes y día de la semana. Es particularmente útil para procesamiento de fin de mes que necesita tener en cuenta longitudes variables de mes.
0 0 L * *— Ejecutar a medianoche el último día de cada mes0 0 * * L— Ejecutar a medianoche el último día de la semana (sábado)0 0 * * 5L— Ejecutar el último viernes de cada mes
W - Día Laborable Más Cercano
El carácter W encuentra el día laborable más cercano a un día dado del mes. Si el día especificado cae en fin de semana, la tarea se ejecuta en el día laborable más cercano en su lugar.
0 0 15W * *— Ejecutar en el día laborable más cercano al 150 0 1W * *— Ejecutar en el primer día laborable del mes0 0 LW * *— Ejecutar en el último día laborable del mes
Almohadilla (#) - Enésimo Día de la Semana
El carácter almohadilla especifica la enésima ocurrencia de un día de la semana dentro de un mes. La sintaxis es día#ocurrencia.
0 0 * * 1#1— Primer lunes de cada mes0 0 * * 5#2— Segundo viernes de cada mes0 0 * * 3#4— Cuarto miércoles de cada mes
Nota que L, W, y # no están soportados en todas las implementaciones de cron. Están disponibles en versiones modernas como Vixie cron y la mayoría de programadores basados en la nube, pero pueden no funcionar en sistemas Unix más antiguos.
Patrones Cron Comunes
Veamos patrones de programación del mundo real que usarás regularmente. Estos ejemplos cubren los escenarios de automatización más comunes.
Cada Minuto, Hora, y Día
* * * * *— Cada minuto (usar con moderación, puede crear problemas de carga)0 * * * *— Cada hora en el minuto 00 0 * * *— Cada día a medianoche0 12 * * *— Cada día a mediodía
Múltiples Veces al Día
0 0,12 * * *— Dos veces al día a medianoche y mediodía0 */6 * * *— Cada 6 horas (0:00, 6:00, 12:00, 18:00)0 8,12,16,20 * * *— Cuatro veces al día en horas específicas*/30 * * * *— Cada 30 minutos
Horarios Semanales
0 0 * * 0— Cada domingo a medianoche0 0 * * 1-5— Días laborables a medianoche0 9 * * 1— Cada lunes a las 9 AM0 0 * * 6,0— Fines de semana a medianoche
Horarios Mensuales
0 0 1 * *— Primer día de cada mes a medianoche0 0 L * *— Último día de cada mes a medianoche0 0 1,15 * *— 1 y 15 de cada mes0 0 1 */3 *— Primer día de cada trimestre (Ene, Abr, Jul, Oct)
Horas de Oficina y Ventanas de Mantenimiento
0 9-17 * * 1-5— Cada hora durante horas de oficina (9 AM-5 PM, Lun-Vie)*/15 9-17 * * 1-5— Cada 15 minutos durante horas de oficina0 2 * * *— 2 AM diariamente (ventana de mantenimiento común)0 3 * * 0— 3 AM cada domingo (mantenimiento semanal)
| Caso de Uso | Expresión Cron | Descripción |
|---|---|---|
| Respaldo de base de datos | 0 2 * * * |
Diariamente a las 2 AM |
| Rotación de registros | 0 0 * * 0 |
Semanalmente el domingo a medianoche |
| Limpieza de caché |