bitlvl
ES

Explicador de expresiones cron

Escribe los cinco campos de una entrada de crontab. Obtienes la planificación en lenguaje llano y las próximas diez veces que se dispararía, en la zona horaria que elijas.

Los resultados y mensajes de esta herramienta se muestran en inglés.

Sintaxis de crontab

┌───────────── minuto        0–59
│ ┌─────────── hora          0–23
│ │ ┌───────── día del mes   1–31
│ │ │ ┌─────── mes           1–12  o jan–dec
│ │ │ │ ┌───── día de la semana 0–7 o sun–sat  (0 y 7 son domingo)
│ │ │ │ │
* * * * *  comando a ejecutar
SintaxisSignificadoEjemplo
*Todos los valores* * * * *cada minuto
5Exactamente ese valor5 0 * * *00:05 cada día
1-5Un rango0 9 * * 1-509:00 los días laborables
*/15Cada n-ésimo valor*/15 * * * *cada 15 minutos
1,15Una lista0 0 1,15 * *medianoche el 1 y el 15
8-18/2Paso dentro de un rango0 8-18/2 * * *cada 2 horas de 08:00 a 18:00
@dailyMacro@dailyigual que 0 0 * * *

La trampa de día del mes / día de la semana

Si tanto el día del mes como el día de la semana están restringidos, el cron estándar se ejecuta cuando coincide cualquiera de los dos, no ambos. 0 0 13 * 5 se dispara cada día 13 y cada viernes, no solo los viernes 13. El explicador señala este caso.

Zonas horarias y horario de verano

Cron se ejecuta en la zona horaria del sistema de la máquina (o la variable CRON_TZ / TZ donde se admita). La noche en que los relojes se adelantan, un trabajo programado a las 02:30 puede no ejecutarse; cuando se atrasan, puede ejecutarse dos veces. Los trabajos que deben ejecutarse exactamente una vez al día están más seguros entre las 03:00 y las 23:00, o en UTC. La lista de ejecuciones de arriba usa las reglas de calendario reales de la zona que elijas, así que puedes comprobar directamente una noche de cambio de hora.

Otras cosas que conviene saber

  • Cron tiene resolución de un minuto. Para segundos, usa un temporizador de systemd o un bucle en el trabajo.
  • El entorno es mínimo: fija PATH en el crontab o usa rutas absolutas, y redirige la salida o se te enviará por correo.
  • % en el campo del comando es un salto de línea salvo que se escape como \%, lo que afecta a date +%F.
  • Las expresiones de seis campos con columna de segundos son sintaxis Quartz/Spring, y los no estándar L, W y # también son Quartz. El crontab normal no los acepta.

Preguntas

¿Cómo ejecuto un trabajo cron cada 5 minutos?

*/5 * * * *. Para cada 5 minutos solo en horario laboral: */5 9-17 * * 1-5.

¿Cómo ejecuto algo a medianoche cada día?

0 0 * * *, o la macro @daily. Para las 00:30 usa 30 0 * * *.

¿Cómo programo el último día del mes?

El cron estándar no puede expresarlo directamente. Ejecuta los días 28–31 y deja que el script compruebe si mañana es día 1: 0 0 28-31 * * [ "$(date -d tomorrow +%d)" = "01" ] && /ruta/al/trabajo.

¿El día de la semana del domingo es 0 o 7?

Ambos. 0 y 7 son domingo en la mayoría de las implementaciones de cron; el lunes es 1. Los nombres (sun, mon) también se aceptan y son más difíciles de equivocar.

¿Por qué mi trabajo se ejecutó a la hora equivocada?

Casi siempre la zona horaria: el servidor está en UTC y esperabas hora local, o al revés. Compruébalo con date en el servidor, o pon CRON_TZ=Europe/Madrid al principio del crontab donde se admita (cronie, Vixie cron).

¿Cuál es la diferencia entre cron y los temporizadores de systemd?

Los temporizadores pueden ejecutarse con expresiones de calendario con segundos, recuperar ejecuciones perdidas tras un reinicio (Persistent=true), registrar en el journal y depender de otras unidades. Cron es más simple y universal. Ambos valen para trabajos programados corrientes.