Expresiones Cron Explicadas: Sintaxis, Ejemplos y Patrones Comunes
· 12 min de lectura
Cron es el programador de tareas basado en tiempo que impulsa la automatización en sistemas operativos tipo Unix. Ya sea que estés respaldando bases de datos, enviando correos programados o ejecutando scripts de mantenimiento, comprender las expresiones cron es esencial para cualquier desarrollador o administrador de sistemas.
Esta guía completa desglosa todo lo que necesitas saber sobre la sintaxis de cron, desde patrones básicos hasta técnicas avanzadas de programación. Aprenderás a escribir, probar y solucionar problemas de expresiones cron con confianza.
Tabla de Contenidos
- Comprendiendo los Fundamentos de Cron
- Sintaxis de Cron: Los Cinco Campos
- Caracteres Especiales y Operadores
- Patrones Comunes de Cron
- Técnicas Avanzadas de Programación
- Administrando tu Crontab
- Variables de Entorno y Rutas
- Errores Comunes y Cómo Evitarlos
- Depurando Tareas Cron
- Alternativas Modernas a Cron
- Preguntas Frecuentes
- Artículos Relacionados
Comprendiendo los Fundamentos de Cron
Cron es un proceso demonio que se ejecuta continuamente en segundo plano de sistemas tipo Unix, verificando cada minuto si hay tareas programadas para ejecutar. El nombre proviene de la palabra griega "chronos", que significa tiempo.
Cada usuario en un sistema puede tener su propio archivo crontab (tabla cron) que contiene tareas programadas. El sistema también mantiene crontabs para tareas a nivel de sistema en directorios como /etc/cron.d/, /etc/cron.daily/ y /etc/cron.hourly/.
Cuando se ejecuta una tarea cron, se ejecuta con los permisos del usuario que posee el crontab. Esto es crucial para consideraciones de seguridad y acceso a archivos. La tarea se ejecuta en un entorno mínimo sin tu configuración habitual de shell, lo cual es una fuente común de confusión para principiantes.
Consejo profesional: Las tareas cron no tienen acceso a tu entorno de shell interactivo. Siempre usa rutas absolutas para comandos y archivos, y establece explícitamente cualquier variable de entorno requerida en tu crontab.
Sintaxis de Cron: Los Cinco Campos
Una expresión cron estándar consiste en cinco campos de fecha y hora seguidos del comando a ejecutar. Comprender estos campos es fundamental para escribir programaciones cron efectivas.
┌───────────── minuto (0-59)
│ ┌───────────── hora (0-23)
│ │ ┌───────────── día del mes (1-31)
│ │ │ ┌───────────── mes (1-12 o ENE-DIC)
│ │ │ │ ┌───────────── día de la semana (0-7, 0 y 7 = Domingo, o DOM-SAB)
│ │ │ │ │
* * * * * comando a ejecutar
Cada campo acepta valores específicos y caracteres especiales que controlan cuándo se ejecuta la tarea. Desglosemos lo que representa cada campo:
| Campo | Rango | Caracteres Especiales | Descripción |
|---|---|---|---|
| Minuto | 0-59 | * , - / | El minuto exacto cuando se ejecuta la tarea |
| Hora | 0-23 | * , - / | Hora en formato de 24 horas (0 = medianoche) |
| Día del Mes | 1-31 | * , - / L W | El día del mes |
| Mes | 1-12 o ENE-DIC | * , - / | Mes del año (1 = Enero) |
| Día de la Semana | 0-7 o DOM-SAB | * , - / L # | Día de la semana (0 y 7 = Domingo) |
El campo de comando puede ser cualquier comando de shell válido, ruta de script o serie de comandos separados por punto y coma. La salida de las tareas cron generalmente se envía por correo electrónico al usuario a menos que se redirija.
Caracteres Especiales y Operadores
El poder de Cron proviene de sus caracteres especiales que permiten patrones de programación flexibles. Dominar estos operadores te permite crear programaciones sofisticadas sin lógica compleja.
El Asterisco (*) - Coincidir con Todos los Valores
El asterisco es el carácter comodín que coincide con todos los valores posibles para un campo. Cuando usas * en un campo, la tarea se ejecuta para cada valor en el rango de ese campo.
Por ejemplo, * * * * * significa "cada minuto de cada hora de cada día de cada mes en cada día de la semana" - en otras palabras, cada minuto.
La Coma (,) - Listar Múltiples Valores
Las comas te permiten especificar múltiples valores discretos. Esto es útil cuando necesitas tiempos específicos no consecutivos.
Ejemplo: 0 9,12,15,18 * * * se ejecuta a las 9 AM, mediodía, 3 PM y 6 PM todos los días.
El Guion (-) - Definir Rangos
Los guiones crean rangos inclusivos de valores. Esto es más limpio que listar muchos valores consecutivos con comas.
Ejemplo: 0 9-17 * * 1-5 se ejecuta cada hora de 9 AM a 5 PM, de lunes a viernes (horario laboral).
La Barra (/) - Valores de Paso
El operador de barra especifica intervalos de paso. La sintaxis es */n o rango/n donde n es el valor de paso.
Ejemplo: */15 * * * * se ejecuta cada 15 minutos (a las :00, :15, :30, :45). También puedes usar rangos: 0-30/5 * * * * se ejecuta cada 5 minutos durante la primera mitad de cada hora.
Caracteres Extendidos (L, W, #)
Estas son extensiones no estándar soportadas por algunas implementaciones de cron como Vixie cron y el programador Quartz, pero no por el cron estándar de Unix.
| Carácter | Significado | Ejemplo | Descripción |
|---|---|---|---|
L |
Último | 0 0 L * * |
Último día del mes a medianoche |
W |
Día laboral | 0 0 15W * * |
Día laboral más cercano al 15 |
# |
N-ésima ocurrencia | 0 0 * * 5#3 |
Tercer viernes de cada mes |
Consejo rápido: Antes de usar los caracteres L, W o #, verifica que tu implementación de cron los soporte. El cron estándar de Unix rechazará estas expresiones. Usa nuestro Generador de Expresiones Cron para probar la compatibilidad.
Patrones Comunes de Cron
Aquí están los patrones cron más frecuentemente usados que encontrarás en aplicaciones del mundo real. Estos cubren la mayoría de las necesidades de programación para tareas de automatización típicas.
Intervalos de Tiempo Básicos
* * * * *- Cada minuto (usar con moderación, puede crear alta carga)*/5 * * * *- Cada 5 minutos*/10 * * * *- Cada 10 minutos*/15 * * * *- Cada 15 minutos (común para scripts de monitoreo)*/30 * * * *- Cada 30 minutos0 * * * *- Cada hora en punto0 */2 * * *- Cada 2 horas0 */4 * * *- Cada 4 horas0 */6 * * *- Cada 6 horas (cuatro veces al día)
Programaciones Diarias
0 0 * * *- Diariamente a medianoche (común para respaldos e informes)0 2 * * *- Diariamente a las 2:00 AM (hora de bajo tráfico para mantenimiento)0 9 * * *- Diariamente a las 9:00 AM (inicio de horario laboral)30 4 * * *- Diariamente a las 4:30 AM0 0,12 * * *- Dos veces al día a medianoche y mediodía0 8,20 * * *- Dos veces al día a las 8 AM y 8 PM
Programaciones Semanales
0 0 * * 0- Semanalmente el domingo a medianoche0 0 * * 1- Semanalmente el lunes a medianoche0 9 * * 1-5- Días laborables a las 9:00 AM0 0 * * 6,0- Fines de semana (sábado y domingo) a medianoche30 4 * * 1- Cada lunes a las 4:30 AM (informes semanales)0 8-17 * * 1-5- Cada hora durante horario laboral (9 AM - 5 PM, Lun-Vie)
Programaciones Mensuales y Anuales
0 0 1 * *- Primer día de cada mes a medianoche0 0 15 * *- Día 15 de cada mes a medianoche0 0 1,15 * *- Día 1 y 15 de cada mes (bimensual)0 0 * * 0- Cada domingo (semanal)0 0 1 1 *- 1 de enero a medianoche (anual)0 0 1 */3 *- Primer día de cada trimestre (Ene, Abr, Jul, Oct)0 0 1 6,12 *- 1 de junio y 1 de diciembre (semestral)
Consejo profesional: Al programar tareas mensuales, ten cuidado con valores de día del mes superiores a 28. Usar 0 0 31 * * solo se ejecutará en meses con 31 días. Para tareas de fin de mes, considera usar el último día del mes anterior o el primer día del mes siguiente en su lugar.
Prueba y valida tus expresiones cron usando nuestro Analizador de Expresiones Cron para ver exactamente cuándo se ejecutarán tus tareas.
Técnicas Avanzadas de Programación
Más allá de los patrones básicos, puedes combinar operadores y campos para crear programaciones sofisticadas que coincidan con requisitos empresariales complejos.
Combinando Múltiples Condiciones
Puedes usar múltiples operadores en un solo campo para crear programaciones matizadas. Por ejemplo, 0 9,12,15 * * 1-5 se ejecuta a las 9 AM, mediodía y 3 PM, pero solo en días laborables.
Otro ejemplo: */10 8-17 * * 1-5 se ejecuta cada 10 minutos, pero solo durante horario laboral (8 AM a 5 PM) en días laborables.
Día del Mes vs Día de la Semana
Cuando se especifican tanto día del mes como día de la semana (no *), la tarea se ejecuta cuando se cumple cualquiera de las condiciones (lógica OR, no AND). Esta es una fuente común de confusión.
Por ejemplo, 0 0 13 * 5 se ejecuta a medianoche el día 13 de cada mes O cada viernes, no solo en viernes 13.
Para programar algo específicamente para viernes 13, necesitarías usar un script que verifique ambas condiciones:
0 0 13 * * [ $(date +\%u) -eq 5 ] && /ruta/al/script.sh
Usando Valores de Paso con Rangos
Puedes combinar rangos y valores de paso para un control preciso. La sintaxis inicio-fin/paso se ejecuta a intervalos dentro de un rango específico.
Ejemplos:
0-30/5 * * * *- Cada 5 minutos durante la primera mitad de cada hora (:00, :05, :10, :15, :20, :25, :30)0 9-17/2 * * *- Cada 2 horas de 9 AM a 5 PM (9 AM, 11 AM, 1 PM, 3 PM, 5 PM)0 0 1-7 * 1- Primer lunes de cada mes (se ejecuta del 1 al 7 si es lunes)