Expresiones cron desveladas: Programa cualquier cosa
Necesitas ejecutar una copia de seguridad de la base de datos cada noche a las 3 AM. O enviar un informe cada lunes por la mañana. O limpiar una caché cada 15 minutos. En servidores Linux y Unix, la herramienta para esto es cron, y la forma de decirle a cron cuándo ejecutar algo es con una expresión cron.
Las expresiones cron parecen intimidantes a primera vista. 0 3 * * * o */15 9-17 * * 1-5 pueden parecer un galimatías si no conoces el patrón. Pero la sintaxis es sorprendentemente simple una vez que entiendes los cinco campos.
Los cinco campos
Toda expresión cron estándar tiene exactamente cinco campos, separados por espacios. Cada campo representa una unidad de tiempo:
┌───────────── minuto (0-59)
│ ┌───────────── hora (0-23)
│ │ ┌───────────── día del mes (1-31)
│ │ │ ┌───────────── mes (1-12)
│ │ │ │ ┌───────────── día de la semana (0-7, donde 0 y 7 son domingo)
│ │ │ │ │
* * * * *
Eso es todo. Cinco campos, de izquierda a derecha: minuto, hora, día del mes, mes, día de la semana.
¿Sabías que? El nombre "cron" viene de la palabra griega "chronos", que significa tiempo. El demonio cron (proceso en segundo plano) ha sido una parte fundamental de los sistemas operativos tipo Unix desde 1975.
Los caracteres especiales
Asterisco (*) — Todos los valores
Un asterisco significa "todos los valores posibles" para ese campo.
* * * * * = cada minuto de cada hora de cada día.
Coma (,) — Múltiples valores
Una coma separa valores individuales.
0 9,12,18 * * * = en el minuto 0 de las horas 9, 12 y 18 (9:00 AM, 12:00 PM, 6:00 PM).
Guion (-) — Rango de valores
Un guion define un rango.
0 9-17 * * * = en el minuto 0 de cada hora desde las 9 hasta las 17 (9:00 AM a 5:00 PM, cada hora).
Barra (/) — Valores de paso
Una barra define intervalos.
*/15 * * * * = cada 15 minutos (minuto 0, 15, 30, 45 de cada hora).
0 */2 * * * = cada 2 horas en el minuto 0 (medianoche, 2 AM, 4 AM, ...).
Leer expresiones cron: Práctica
Vamos a analizar ejemplos comunes. Para cada uno, lee los cinco campos de izquierda a derecha.
0 3 * * * — Diariamente a las 3:00 AM
| Campo | Valor | Significado |
|---|---|---|
| Minuto | 0 | En el minuto 0 |
| Hora | 3 | De la hora 3 (3 AM) |
| Día del mes | * | Todos los días |
| Mes | * | Todos los meses |
| Día de la semana | * | Todos los días de la semana |
Traducción: "A las 3:00 AM todos los días." La opción clásica para copias de seguridad nocturnas.
*/15 * * * * — Cada 15 minutos
| Campo | Valor | Significado |
|---|---|---|
| Minuto | */15 | Cada 15 minutos |
| Hora | * | Todas las horas |
| Día del mes | * | Todos los días |
| Mes | * | Todos los meses |
| Día de la semana | * | Todos los días |
Traducción: "Cada 15 minutos, las 24 horas." Común para comprobaciones de salud y actualizaciones de caché.
0 9 * * 1-5 — De lunes a viernes a las 9:00 AM
| Campo | Valor | Significado |
|---|---|---|
| Minuto | 0 | En el minuto 0 |
| Hora | 9 | De la hora 9 |
| Día del mes | * | Todos los días |
| Mes | * | Todos los meses |
| Día de la semana | 1-5 | De lunes a viernes |
Traducción: "A las 9:00 AM, de lunes a viernes." Perfecto para informes diarios de trabajo.
0 0 1 * * — Primer día de cada mes
| Campo | Valor | Significado |
|---|---|---|
| Minuto | 0 | En el minuto 0 |
| Hora | 0 | De la hora 0 (medianoche) |
| Día del mes | 1 | El día 1 |
| Mes | * | Todos los meses |
| Día de la semana | * | Cualquier día de la semana |
Traducción: "A medianoche del primer día de cada mes." Usado para informes mensuales, facturación o limpiezas.
30 8 * * 1 — Lunes a las 8:30 AM
| Campo | Valor | Significado |
|---|---|---|
| Minuto | 30 | En el minuto 30 |
| Hora | 8 | De la hora 8 |
| Día del mes | * | Todos los días |
| Mes | * | Todos los meses |
| Día de la semana | 1 | Lunes |
Traducción: "A las 8:30 AM todos los lunes." Ideal para notificaciones semanales de equipo.
Escribir tus propias expresiones cron
Aquí tienes un enfoque sistemático:
- Empieza con el cuándo. "Todos los días a las 3 AM" o "cada 5 minutos durante el horario laboral".
- Rellena los campos de izquierda a derecha. Empieza con el minuto, luego la hora, luego el día del mes, luego el mes, luego el día de la semana.
- Usa
*para "todos". Si no te importa un campo, usa*. - Prueba antes de desplegar. Siempre verifica que tu expresión produce la programación que esperas.
Referencia rápida de patrones comunes
| Programación | Expresión |
|---|---|
| Cada minuto | * * * * * |
| Cada 5 minutos | */5 * * * * |
| Cada hora | 0 * * * * |
| Todos los días a medianoche | 0 0 * * * |
| Todos los días a las 3:00 AM | 0 3 * * * |
| Todos los lunes a las 9:00 AM | 0 9 * * 1 |
| De lunes a viernes a las 8:30 AM | 30 8 * * 1-5 |
| Primer día de cada mes | 0 0 1 * * |
| Cada 15 min, horario laboral | */15 9-17 * * 1-5 |
| Dos veces al día (9 AM y 6 PM) | 0 9,18 * * * |
| Todos los domingos a las 2:00 AM | 0 2 * * 0 |
Errores comunes
Olvidar que las horas van de 0 a 23
La hora 13 es la 1:00 PM, no la hora 1. Un error común es escribir 0 1 * * * pensando que se ejecuta a la 1:00 PM cuando en realidad se ejecuta a la 1:00 AM.
Confusión con el día de la semana
El domingo puede ser 0 o 7 (ambos son válidos). El lunes es 1, el sábado es 6. Algunas personas esperan que el lunes sea 0.
Interacción entre día del mes y día de la semana
Si especificas tanto el día del mes como el día de la semana (ninguno es *), la mayoría de las implementaciones de cron ejecutan la tarea cuando cualquiera de las condiciones se cumple, no cuando ambas se cumplen. Esto sorprende a muchas personas.
Advertencia La expresión 0 9 15 * 1 NO significa "a las 9 AM el día 15, pero solo si es lunes". Significa "a las 9 AM el día 15 de cada mes Y a las 9 AM todos los lunes". Esta es una fuente común de comportamiento inesperado.
Conciencia de la zona horaria
Cron se ejecuta en la zona horaria local del servidor. Si tu servidor está en UTC y tú estás en Madrid (UTC+1), una tarea cron con 0 9 * * * se ejecuta a las 10:00 AM de tu hora. Siempre verifica la zona horaria de tu servidor.
Consejo Prueba y visualiza tus expresiones cron antes de desplegarlas: Cómo leer y probar expresiones cron. Consulta las próximas ejecuciones y confirma que la programación coincide con lo que deseas.
Crea y prueba tus expresiones cron:
Gratis, instantáneo y sin necesidad de registro.