Cómo solucionar "invalid cron expression" y errores comunes de sintaxis Cron: Guía Completa
Cron es la herramienta estándar para programar tareas repetitivas en sistemas operativos tipo Unix. Ya sea que esté ejecutando un respaldo de base de datos cada noche o enviando un boletín informativo cada lunes, Cron es el motor detrás de escena. Sin embargo, su sintaxis de "cinco campos" (o seis campos) puede ser confusa, lo que genera errores como invalid cron expression (expresión cron inválida), cron syntax error (error de sintaxis cron) o el más frustrante: cron job not running (el trabajo cron no se está ejecutando).
In esta guía, desglosaremos la sintaxis de Cron y le mostraremos cómo corregir los errores de programación más comunes.
1. Mensajes de Error Comunes de Cron
A diferencia de un compilador, Cron no siempre ofrece un mensaje de error claro. En su lugar, es posible que vea:
- Validación de Crontab:
crontab: installing new crontabseguido deerrors in crontab file, can't install(errores en el archivo crontab, no se puede instalar). - Logs del Sistema:
ORPHAN (no passwd entry)oCMD (failed to execute). - Librerías de Procesamiento:
invalid cron expression,Unexpected end of expressionoNumber out of range(número fuera de rango).
2. Principales Causas y Soluciones
2.1 La Confusión entre "5 vs 6 Campos"
El Cron estándar de Linux (Vixie) utiliza 5 campos:
Minuto Hora Día Mes Día-de-la-semana
Sin embargo, muchas librerías modernas (como Quartz en Java o Node-Cron) y algunos sistemas (como AWS Lambda o Spring) utilizan 6 campos, añadiendo Segundos al principio o el Año al final.
El Error: Usar una expresión de 6 campos en un crontab estándar de Linux.
La Solución:
Consulte la documentación de su entorno. Si está usando crontab -e en Linux, use 5 campos. Si está usando una librería específica, verifique si espera segundos.
2.2 Errores de Rango y Paso
Cron utiliza / para pasos (ej., */5 para cada 5 unidades) y - para rangos. Un error común es usar un número fuera del rango permitido.
El Error:
* * 31 2 *(Intentar ejecutar el 31 de febrero)60 * * * *(El minuto 60 es inválido; use 0-59)* 24 * * *(La hora 24 es inválida; use 0-23)
La Solución: Asegúrese siempre de que sus números estén dentro de estos límites:
- Minutos: 0-59
- Horas: 0-23
- Día del mes: 1-31
- Mes: 1-12 (o JAN-DEC)
- Día de la semana: 0-6 (0 es domingo, o SUN-SAT)
2.3 La Trampa de "Día del Mes" vs "Día de la Semana"
En el Cron estándar, si especifica tanto un "Día del Mes" como un "Día de la Semana", la tarea se ejecutará cuando se cumpla cualquiera de las condiciones (lógica OR), no ambas (lógica AND).
El Error:
0 0 1 * 1 (Espera que se ejecute solo si el día 1 del mes es lunes, pero en realidad se ejecutará cada día 1 del mes Y cada lunes).
La Solución:
Para lograr la lógica "AND", debe usar una verificación por comando:
0 0 1 * * [ "$(date +\%u)" = "1" ] && /path/to/command
2.4 Variables de Entorno y Rutas
Una razón muy común para que un "cron no se ejecute" es que Cron ejecuta comandos en un entorno muy mínimo. Su PATH puede ser diferente y su .bashrc no se carga.
El Síntoma: El comando funciona cuando lo ejecuta manualmente pero falla en Cron.
La Solución:
Utilice siempre rutas absolutas tanto para el comando como para cualquier archivo que este toque:
/usr/bin/python3 /home/usuario/script.py >> /home/usuario/cron.log 2>&1
3. Solución de Problemas Avanzada
3.1 Signos de Porcentaje (%) en Crontab
En un archivo crontab, el signo de porcentaje % tiene un significado especial (representa una nueva línea). Si su comando contiene un % (común en comandos date), debe escaparlo con una barra invertida \%.
El Error:
0 0 * * * tar -cvf backup-$(date +%Y-%m-%d).tar /data
La Solución:
0 0 * * * tar -cvf backup-$(date +\%Y-\%m-\%d).tar /data
3.2 Redirección de Salida
Si un trabajo de Cron falla silenciosamente, generalmente es porque la salida (stdout/stderr) se envía a un archivo de correo local que nunca revisa.
Solución: Redirija siempre la salida a un archivo de log para ver qué salió mal: >> /var/log/mi_trabajo.log 2>&1.
4. Prevención y Mejores Prácticas
- Use un Analizador/Generador: No adivine. Use una herramienta visual para ver exactamente cuándo se ejecutará su expresión.
- Comente sus Trabajos: Añada siempre un comentario sobre su entrada de crontab explicando qué hace.
- Use Rutas Absolutas: No podemos enfatizar esto lo suficiente.
/usr/local/bin/nodeen lugar denode. - Pruebe con "Cada Minuto": Al configurar un trabajo por primera vez, ajústelo a
* * * * *para verificar que funciona, luego cámbielo a la programación real.
5. FAQ: Preguntas Frecuentes
P: ¿El 0 o el 7 representan el domingo?
R: En la mayoría de las implementaciones de Cron (como Linux), tanto el 0 como el 7 representan el domingo. Sin embargo, algunas usan estrictamente el 0. Usar SUN suele ser más claro.
P: ¿Cómo ejecuto una tarea cada 5 minutos?
R: Use la sintaxis de paso: */5 * * * *.
P: ¿Por qué mi trabajo de Cron no se ejecutó a las 2 AM durante el cambio de horario?
R: Este es un problema clásico. Cuando el reloj se adelanta o se atrasa, los trabajos programados durante esa hora pueden ejecutarse dos veces o no ejecutarse en absoluto. Solución: Evite programar tareas críticas entre la 1 AM y las 3 AM, o configure su servidor en hora UTC.
6. Herramienta de Verificación Rápida
¿Confundido por los asteriscos y las barras? Use nuestro Analizador y Visualizador de Expresiones Cron. Puede:
- Traducir instantáneamente la sintaxis Cron a un lenguaje humano comprensible.
- Calcular los próximos 5 tiempos de ejecución.
- Soportar formatos de 5 y 6 campos.
- Validar su expresión y resaltar errores de sintaxis.
Errores Relacionados
- Solución de errores 'Unexpected token in JSON'
- Cómo corregir errores de 'invalid base64 string'
- Entendiendo los errores de indentación en YAML