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 | Sintaxis | Significado | Ejemplo | |
|---|---|---|---|
| * | Todos los valores | * * * * * | cada minuto |
| 5 | Exactamente ese valor | 5 0 * * * | 00:05 cada día |
| 1-5 | Un rango | 0 9 * * 1-5 | 09:00 los días laborables |
| */15 | Cada n-ésimo valor | */15 * * * * | cada 15 minutos |
| 1,15 | Una lista | 0 0 1,15 * * | medianoche el 1 y el 15 |
| 8-18/2 | Paso dentro de un rango | 0 8-18/2 * * * | cada 2 horas de 08:00 a 18:00 |
| @daily | Macro | @daily | igual 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
PATHen 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 adate +%F.- Las expresiones de seis campos con columna de segundos son sintaxis Quartz/Spring, y los no estándar
L,Wy#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.