Menú
dev 10 min de lectura |

Hoja de Referencia de Cron Jobs: Una Guía Completa para Desarrolladores

La automatización de tareas repetitivas es una habilidad fundamental para cualquier desarrollador o administrador de sistemas. Ya sea para realizar copias de seguridad diarias, enviar correos electrónicos informativos o limpiar archivos de registro temporales, no querrás ejecutar estos comandos manualmente cada vez. En el mundo de los sistemas operativos tipo Unix (Linux, macOS, BSD), la forma estándar de gestionar la programación de tareas es a través de Cron.

Aunque el concepto es sencillo, la sintaxis de las expresiones cron puede resultar intimidante para los principiantes. Esta guía profundiza en el funcionamiento de las tareas cron, proporcionándote los conocimientos necesarios para programar desde un script simple hasta rutinas de mantenimiento complejas. Si tienes prisa, siempre puedes usar nuestro Generador de Cron Jobs para crear expresiones válidas al instante.

¿Qué es un Cron Job?

Un "cron job" es una tarea programada que el sistema ejecuta automáticamente a intervalos fijos o en momentos específicos. El nombre proviene de chronos, la palabra griega para el tiempo. El servicio responsable de gestionar estas tareas se llama crond (demonio cron), que se ejecuta en segundo plano y comprueba los archivos de configuración (crontabs) cada minuto para ver si hay alguna tarea pendiente de ejecución.

Los cron jobs son esenciales para:

  • Mantenimiento del Sistema: Rotación de registros, limpieza de cachés y actualización de paquetes del sistema.
  • Operaciones de Base de Datos: Copias de seguridad periódicas y optimización de índices.
  • Tareas de Aplicación: Envío de notificaciones programadas, procesamiento de colas o extracción de datos (scraping).
  • Automatización DevOps: Activación de despliegues o comprobaciones de estado (health checks).

Entendiendo la Sintaxis de las Expresiones Cron

El núcleo de cualquier cron job es la expresión cron: una cadena de cinco (o a veces seis) campos separados por espacios. Cada campo representa una unidad de tiempo específica. Cuando la hora actual del sistema coincide con el patrón definido en la expresión, se ejecuta el comando asociado.

El formato estándar es:

* * * * *
- - - - -
| | | | |
| | | | +----- Día de la semana (0 - 6) (Domingo=0 o 7)
| | | +------- Mes (1 - 12)
| | +--------- Día del mes (1 - 31)
| +----------- Hora (0 - 23)
+------------- Minuto (0 - 59)

1. Minutos (0 - 59)

Este campo determina en qué minuto de la hora comienza la tarea. Por ejemplo, 15 * * * * ejecuta la tarea en el minuto 15 de cada hora.

2. Horas (0 - 23)

El segundo campo especifica la hora del día. Ten en cuenta que cron utiliza un reloj de 24 horas. 0 13 * * * se ejecutaría a la 1:00 PM todos los días.

3. Día del Mes (1 - 31)

Este campo define el día del calendario. Si especificas 0 0 1 * *, la tarea se ejecuta a medianoche el primer día de cada mes.

4. Mes (1 - 12)

El cuarto campo indica el mes. Puedes usar números (1-12) o las tres primeras letras del nombre del mes en inglés (JAN, FEB, MAR, etc.).

5. Día de la Semana (0 - 6)

Define en qué día de la semana se ejecuta la tarea. 0 y 7 representan el domingo. También puedes usar abreviaturas de tres letras (SUN, MON, TUE, etc.). Nota Crucial: En la mayoría de las implementaciones de cron, si se especifican tanto el "Día del Mes" como el "Día de la Semana", la tarea se ejecutará cuando se cumpla cualquiera de las dos condiciones.

Caracteres Especiales en las Expresiones Cron

Para que la programación sea más flexible, cron admite varios caracteres especiales:

El Asterisco (*) - "Cada"

El asterisco es un comodín que representa todos los valores posibles para un campo. * * * * * significa cada minuto, cada hora, cada día, etc.

La Coma (,) - "Lista de Valores"

Usa una coma para especificar una lista de valores. 0 8,12,18 * * * ejecutará el comando a las 8:00 AM, 12:00 PM y 6:00 PM diariamente.

El Guion (-) - "Rango"

El guion te permite definir un rango de valores. 0 9-17 * * 1-5 ejecuta la tarea cada hora en punto desde las 9 AM hasta las 5 PM, pero solo los días laborables (de lunes a viernes).

La Barra (/ ) - "Valores de Incremento"

La barra se utiliza para incrementos. */15 * * * * significa "cada 15 minutos". Es una abreviatura de 0,15,30,45 en el campo de los minutos.

Ejemplos Comunes de Cron

Aquí tienes algunos patrones frecuentemente utilizados para ayudarte a empezar:

  • Cada minuto: * * * * *
  • Cada 5 minutos: */5 * * * *
  • Cada hora en el minuto 0: 0 * * * *
  • Cada día a medianoche: 0 0 * * *
  • Cada domingo a las 3 AM: 0 3 * * 0
  • Cada día laborable a las 9 AM: 0 9 * * 1-5
  • Dos veces al mes (1 y 15) a las 10 PM: 0 22 1,15 * *

Cadenas Especiales No Estándar

Muchas versiones modernas de cron (como Vixie Cron) admiten alias abreviados para intervalos comunes:

  • @reboot : Se ejecuta una vez al inicio.
  • @yearly o @annually : Se ejecuta una vez al año (0 0 1 1 *).
  • @monthly : Se ejecuta una vez al mes (0 0 1 * *).
  • @weekly : Se ejecuta una vez a la semana (0 0 * * 0).
  • @daily o @midnight : Se ejecuta una vez al día (0 0 * * *).
  • @hourly : Se ejecuta una vez por hora (0 * * * *).

Gestión de tu Crontab

Cada usuario en un sistema Linux tiene su propio archivo "crontab" (tabla cron). Para interactuar con él, utiliza el comando crontab:

  • crontab -e: Abre tu crontab en el editor de texto predeterminado. Aquí es donde añades o modificas tus programaciones.
  • crontab -l: Muestra el contenido actual de tu crontab.
  • crontab -r: Elimina todo tu crontab. ¡Úsalo con precaución!
  • crontab -u usuario -e: (Solo root) Edita el crontab de otro usuario.

Errores Comunes y Mejores Prácticas

Incluso los desarrolladores experimentados suelen tener problemas con los cron jobs. Aquí te explicamos cómo evitar los dolores de cabeza más comunes:

1. El Entorno Mínimo

Los cron jobs se ejecutan con un conjunto muy básico de variables de entorno. El $PATH que tienes en tu shell interactivo (por ejemplo, /usr/local/bin) puede no estar disponible. Usa siempre rutas absolutas tanto para los comandos como para los scripts que ejecutes. En lugar de python script.py, usa /usr/bin/python3 /home/usuario/scripts/script.py.

2. Directorio de Trabajo

Por defecto, los cron jobs suelen ejecutarse en el directorio personal del usuario. Si tu script depende de rutas de archivo relativas, podría fallar. Es una buena práctica hacer cd al directorio correcto primero: * * * * * cd /ruta/al/app && ./run.sh.

3. Captura de Salida (Registro)

Por defecto, cron intenta enviar la salida (stdout y stderr) de la tarea por correo electrónico al usuario. Si el correo no está configurado, la salida se suele perder. Para depurar y supervisar tus tareas, redirige la salida a un archivo de registro:

* * * * * /ruta/al/comando >> /var/log/mi_tarea.log 2>&1

La parte 2>&1 garantiza que se capturen tanto la salida estándar como los mensajes de error.

4. Problemas de Permisos

Asegúrate de que el script que intentas ejecutar sea ejecutable. Usa chmod +x script.sh para establecer los permisos correctos. Además, recuerda que un cron job se ejecuta con los permisos del usuario propietario del crontab.

5. Ejecución Concurrente

Si una tarea tarda más en ejecutarse que el intervalo en el que está programada (por ejemplo, un script de copia de seguridad que tarda 10 minutos pero está programado cada 5 minutos), podrías acabar con varias instancias ejecutándose simultáneamente. Esto puede causar una alta carga en el servidor o corrupción de datos. Usa un mecanismo de bloqueo como flock para evitarlo:

*/5 * * * * /usr/bin/flock -n /tmp/mi_tarea.lock /ruta/al/script.sh

Alternativas Modernas a Cron

Aunque cron es fiable, tiene limitaciones (como la falta de programación en menos de un minuto o lógica de reintento incorporada). Dependiendo de tus necesidades, podrías considerar:

  • Systemd Timers: El reemplazo moderno de cron en la mayoría de las distribuciones de Linux. Proporciona mejores registros y gestión de dependencias.
  • GitHub Actions / GitLab CI: Para programar tareas relacionadas con repositorios de código.
  • Kubernetes CronJobs: Para cargas de trabajo en contenedores.
  • Colas de Tareas (Celery, BullMQ): Para programación de tareas más compleja a nivel de aplicación con reintentos y control de concurrencia.

Conclusión

Cron sigue siendo una de las herramientas más importantes en el arsenal de un desarrollador. Al dominar la sintaxis y seguir las mejores prácticas para el registro y la gestión del entorno, puedes crear sistemas robustos y que se mantienen solos. No olvides usar nuestro Conversor de Unix Timestamp si necesitas depurar lógica específica de tiempo en tus scripts programados, o JSON a TypeScript si estás procesando datos de API dentro de tus tareas automatizadas.

Las tareas correctamente programadas son los héroes silenciosos de la infraestructura moderna. Tómate el tiempo para configurarlas correctamente y te ahorrarán incontables horas de trabajo manual.