Fecha y hora

Cómo leer y escribir expresiones cron: los cinco campos y ejemplos habituales

Copia de seguridad cada día a las 2:00, informe a las 9:00 los días laborables, comprobación de estado cada diez minutos: aquí tienes todo lo necesario para programar tareas recurrentes con cron.

Los cinco campos

Una expresión cron estándar de Unix tiene cinco campos separados por espacios: minuto (0–59), hora (0–23), día del mes (1–31), mes (1–12) y día de la semana (0–7, donde 0 y 7 son domingo). La tarea se ejecuta cuando coinciden todos los campos.

Por ejemplo, 0 2 * * * significa minuto 0, hora 2, todos los días, todos los meses, cualquier día de la semana: a las 2:00 cada día. Un asterisco significa «cualquier valor».

┌───── minuto (0-59)
│ ┌─── hora (0-23)
│ │ ┌─ día del mes (1-31)
│ │ │ ┌ mes (1-12)
│ │ │ │ ┌ día de la semana (0-7, dom=0 o 7)
│ │ │ │ │
0 2 * * *

Cuatro caracteres especiales

Combinando estos cuatro se cubren la mayoría de las programaciones. Algunos sistemas también aceptan nombres como MON y JAN.

  • * (cualquiera): * en el campo hora significa cada hora.
  • , (lista): 1,15 significa el día 1 y el 15.
  • - (rango): 1-5 en el campo día de la semana significa de lunes a viernes.
  • / (paso): */10 en el campo minuto significa 0, 10, 20… cada diez minutos. También puedes indicar un inicio, como en 5-59/15.

Ejemplos habituales

Después de escribir una expresión, calcula las próximas ejecuciones para confirmar que hace lo que pretendes. Recuerda que los pasos cuentan desde cero, no desde que arranca la tarea: */45 en el campo minuto se ejecuta a las :00 y :45 de cada hora, no cada 45 minutos.

*/5 * * * *      cada 5 minutos
0 * * * *        cada hora en punto
30 9 * * 1-5     09:30 los días laborables
0 0 1 * *        medianoche del día 1 de cada mes
0 18 * * 5       18:00 cada viernes
0 3 * * 0        03:00 cada domingo
0 9,18 * * *     09:00 y 18:00 cada día
0 0 1 1 *        medianoche del 1 de enero

Trampas habituales

La trampa más conocida consiste en fijar a la vez el día del mes y el día de la semana. 0 0 13 * 5 parece «viernes 13», pero en el cron estándar, cuando ninguno de los dos campos es *, se combinan con O: la tarea se ejecuta el día 13 de cada mes y todos los viernes.

La segunda es «el último día del mes». El cron estándar de cinco campos no tiene símbolo para ello; una solución habitual es ejecutar los días 28 a 31 y que el script compruebe si mañana es día 1. Algunos programadores como Quartz admiten L, pero usan un formato de seis o siete campos con segundos que no es compatible con el cron estándar.

¿Qué zona horaria usa cron?

Cron sigue la zona horaria del sistema del servidor. La mayoría de los servidores en la nube funcionan en UTC, así que un informe pensado para las 9:00 en Madrid puede salir a las 10:00 o las 11:00 según la época del año. Las 9:00 en Madrid son las 8:00 UTC en invierno (7:00 UTC en verano), por lo que en un servidor UTC escribirías 0 8 * * * en invierno.

GitHub Actions y los CronJobs de Kubernetes también usan UTC por defecto. Como España cambia al horario de verano, cuenta con que la hora local de ejecución se desplace una hora dos veces al año.

Consejos de operación

En el generador cron de AIBIZAP eliges «diario» o «semanal» y la expresión se construye sola, así aciertas con la programación sin memorizar la sintaxis.

  • Reparte las tareas pesadas en minutos como :07 o :23 en lugar de lanzarlas todas a las :00.
  • Si una ejecución puede no terminar antes de que empiece la siguiente, añade un bloqueo para evitar solapamientos.
  • El entorno y el PATH de cron difieren de tu shell interactiva, así que usa rutas absolutas en los scripts.
  • Registra la salida de cada ejecución para que ningún fallo pase desapercibido.

Pruébalo con estas herramientas

Más guías

Todas las guías