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

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

Programaciones Diarias

Programaciones Semanales

Programaciones Mensuales y Anuales

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: