Guía de Referencia de Cron en Linux
Has desplegado tu aplicación Node en un servidor Linux y necesitas que un script se ejecute cada noche a las 3 AM. Has oído hablar de cron, pero la sintaxis parece críptica y los tutoriales que has encontrado están desactualizados o llenos de imprecisiones. Esta guía de referencia de cron en Linux te proporciona la información correcta y consciente de las distribuciones que necesitas para programar trabajos cron de manera confiable.
Puntos Clave
- Cron utiliza un formato de cinco campos (minuto, hora, día del mes, mes, día de la semana) seguido del comando a ejecutar.
- Cuando se especifican tanto el día del mes como el día de la semana, cron los trata como OR (O), no AND (Y)—una fuente común de comportamiento inesperado.
- Cron se ejecuta con un entorno limitado y dependiente de la distribución, por lo que siempre debes usar rutas absolutas y establecer PATH explícitamente para portabilidad.
- Diferentes distribuciones de Linux utilizan diferentes implementaciones de cron con soporte de características variables.
Sintaxis de Crontab: El Formato de Cinco Campos
Cada trabajo cron sigue esta estructura:
┌───────────── minuto (0-59)
│ ┌─────────── hora (0-23)
│ │ ┌───────── día del mes (1-31)
│ │ │ ┌─────── mes (1-12)
│ │ │ │ ┌───── día de la semana (0-6, Domingo=0)
│ │ │ │ │
* * * * * comando
Caracteres especiales:
*— cualquier valor,— separador de lista (1,3,5)-— rango (1-5)/— valores de paso (*/15 significa cada 15)
Importante: Caracteres como L, W, # y ? son sintaxis del programador Quartz, no de cron estándar. No los uses en crontabs de Linux. En caso de duda, consulta la documentación de tu sistema mediante man 5 crontab.
Patrones de Programación Comunes
*/5 * * * * # Cada 5 minutos
0 * * * * # Al inicio de cada hora
0 3 * * * # Diariamente a las 3 AM
0 0 * * 0 # Semanalmente los domingos a medianoche
0 0 1 * * # Primer día de cada mes
Cadenas Especiales
La mayoría de las implementaciones de cron soportan estos atajos (el soporte puede variar en sistemas mínimos como BusyBox):
| Cadena | Equivalente |
|---|---|
@reboot | Ejecutar una vez al iniciar |
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
Ten en cuenta que @reboot no garantiza que la red u otros servicios estén disponibles; para trabajos de inicio con dependencias, los temporizadores de systemd suelen ser una mejor opción.
La Trampa del Día del Mes vs Día de la Semana
Cuando especificas tanto el día del mes COMO el día de la semana, cron los trata como OR (O), no AND (Y):
0 0 15 * 1 # Se ejecuta el día 15 O cualquier lunes
Esto toma a muchas personas por sorpresa. Si necesitas “el día 15, pero solo si es lunes”, maneja esa lógica dentro de tu script.
Manejo del Entorno
Cron se ejecuta con un entorno limitado y no interactivo. Aquí es donde la mayoría de los trabajos fallan silenciosamente.
El comportamiento de PATH varía según la distribución y versión:
- Algunos sistemas definen un PATH predeterminado mínimo
- Otros (notablemente versiones recientes de Ubuntu) pueden heredar PATH del entorno del servicio
No confíes en los valores predeterminados. Para un comportamiento portable y predecible, establece explícitamente lo que necesitas.
Prácticas seguras:
# Establece variables al inicio de tu crontab
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""
# Siempre usa rutas absolutas
0 3 * * * /usr/bin/node /home/deploy/app/cleanup.js
Nota: MAILTO solo funciona si hay un MTA local instalado y configurado. Muchos servidores modernos no tienen uno. Redirige la salida explícitamente en lugar de depender del correo electrónico.
Discover how at OpenReplay.com.
Salida y Registro de Logs
# Registrar todo
0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
# Descartar toda la salida
0 3 * * * /path/to/script.sh >/dev/null 2>&1
# Registrar solo errores
0 3 * * * /path/to/script.sh >/dev/null 2>> /var/log/myjob-errors.log
Comandos Esenciales de Crontab
crontab -e # Editar tu crontab
crontab -l # Listar trabajos actuales
crontab -r # Eliminar todos los trabajos (¡cuidado!)
Para trabajos a nivel del sistema, utiliza archivos en /etc/cron.d/. Ten en cuenta que /etc/cron.daily/, /etc/cron.hourly/, etc. se ejecutan mediante run-parts, no son escaneados automáticamente por cron. Consulta man 8 run-parts para las reglas de nomenclatura y ejecución.
Las Implementaciones de Cron Varían
Diferentes sistemas ejecutan diferentes demonios cron:
- Debian/Ubuntu: cron (linaje Vixie, parcheado por la distribución)
- RHEL/Fedora: Cronie
- Alpine/contenedores: BusyBox
crond
El soporte de características (cadenas especiales, comportamiento de correo, registro) puede diferir. Siempre verifica contra la página del manual local crontab(5).
Cron vs Temporizadores de Systemd
| Consideración | Cron | Temporizadores de Systemd |
|---|---|---|
| Complejidad de configuración | Simple | Más verboso |
| Manejo de trabajos perdidos | Omitidos | Configurable (Persistent=true) |
| Dependencias | Ninguna | Puede esperar servicios/montajes |
| Registro | Manual | journald integrado |
Usa cron cuando: Necesites programación simple y portable que funcione en todas partes.
Usa temporizadores de systemd cuando: Necesites gestión de dependencias, programación persistente entre reinicios, o mejor integración con sistemas Linux modernos. La documentación del proyecto systemd sobre unidades timer es la referencia canónica.
Lista de Verificación Rápida para Depuración
- ¿Está cron ejecutándose?
systemctl status cronosystemctl status crond(el nombre del servicio varía según la distribución) - Revisa los logs:
grep CRON /var/log/syslog(Debian/Ubuntu) o/var/log/cron(RHEL/Fedora) - Prueba tu comando manualmente con un entorno restringido
- Verifica rutas absolutas para todos los comandos y archivos
- Comprueba los permisos de archivo en tu script
Conclusión
Cron sigue siendo la forma más simple de programar trabajos en Linux. Domina la sintaxis de cinco campos, comprende el comportamiento OR al combinar campos de día, y ten en cuenta el comportamiento del entorno específico de cada distribución. Con estos fundamentos en su lugar, tus tareas programadas se ejecutarán de manera confiable durante años.
Preguntas Frecuentes
La causa más común son problemas de entorno. Cron se ejecuta con un entorno limitado y no interactivo que difiere de tu shell, y el comportamiento de PATH varía según la distribución. Siempre usa rutas absolutas, establece explícitamente las variables requeridas, verifica que el servicio cron esté ejecutándose y revisa los logs del sistema para detectar errores.
Usa el campo de día de la semana con un rango desde lunes (1) hasta viernes (5). Por ejemplo, para ejecutar a las 9 AM cada día laboral usa: 0 9 * * 1-5 /path/to/script.sh. Recuerda que domingo es 0 y sábado es 6 en la sintaxis estándar de cron.
Los crontabs de usuario se editan con crontab -e y se almacenan por usuario. Los crontabs del sistema en /etc/cron.d/ incluyen un campo adicional de nombre de usuario después de la especificación de tiempo para indicar qué usuario ejecuta el comando. Los crontabs del sistema son más adecuados para servicios y administración compartida.
Ejecuta tu comando manualmente en un entorno mínimo que imite a cron. Por ejemplo: env -i PATH=/usr/bin:/bin /path/to/script.sh. Esto ayuda a identificar dependencias faltantes o problemas de ruta que de otro modo causarían fallos silenciosos.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.