Constructor de Cron
- Empieza por una plantilla si alguna se acerca a lo que necesitas.
- Ajusta los cinco campos: minuto, hora, día del mes, mes y día de la semana.
- La descripción en lenguaje natural se actualiza con cada cambio: úsala para comprobar que la expresión hace lo que crees.
- Copia la expresión terminada en tu crontab, CI o planificador.
El orden es siempre minuto, hora, día del mes, mes y día de la semana. El minuto va de 0 a 59, la hora de 0 a 23, el día del mes de 1 a 31, el mes de 1 a 12 y el día de la semana de 0 a 6, siendo 0 el domingo.
El asterisco significa "todos los valores". La coma lista valores concretos, como 1,15. El guion define un intervalo, como 1-5. La barra define un paso, como */15 para "cada 15".
Un error frecuente es escribir */5 en el campo de la hora esperando "cada 5 minutos". En ese campo significa "cada 5 horas".
Cuando los dos campos tienen un valor distinto del asterisco, la mayoría de las implementaciones de cron los combina con O, no con Y.
Así, 0 0 1 * 1 no significa "todos los lunes que caigan en día 1", sino "todo día 1 del mes Y también todos los lunes": muchas más ejecuciones de las esperadas.
Si necesitas una condición conjunta, deja uno de los dos campos como asterisco y haz la comprobación restante dentro del propio script.
Cron se ejecuta en la zona horaria del servidor, no en la tuya. Una tarea programada para las 9 se ejecuta a las 9 del servidor, que puede ser otra hora para ti.
El horario de verano crea dos casos incómodos: el día en que el reloj se adelanta, una ejecución programada en la hora saltada puede no ocurrir; el día en que se atrasa, puede ocurrir dos veces. Las tareas críticas suelen programarse en UTC para evitarlo.
Conviene recordar que cron no garantiza la ejecución: si la máquina está apagada a esa hora, esa ocurrencia simplemente se pierde.
Preguntas frecuentes
Usa */5 en el primer campo: */5 * * * *. La barra es el operador de paso y vale para el campo en el que aparece.
La convención estándar es 0. Varias implementaciones también aceptan 7 como domingo, pero 0 es el valor seguro en cualquier entorno.
Probablemente porque rellenaste a la vez el día del mes y el día de la semana. La mayoría de las implementaciones los combina con O, sumando ejecuciones en lugar de restringirlas.
Son atajos. @daily equivale a 0 0 * * *, @hourly a 0 * * * *, @weekly a 0 0 * * 0 y @monthly a 0 0 1 * *. No todos los planificadores los aceptan, pero el cron de Unix sí.
En la del servidor donde está configurado cron. Para evitar sorpresas con el horario de verano, muchos equipos estandarizan sus servidores en UTC.