~/docs /DevOps/Systemd/OnCalendar
DevOps
OnCalendar
Imported from Notion: OnCalendar
updated:: 2026.07.10
Qué resuelve
OnCalendar= define cuándo se activa un .timer de systemd usando expresiones de calendario. Va dentro del archivo .timer, no dentro del .service.
[!NOTE] 💡 Los timers no siempre disparan exactamente en el segundo indicado:
AccuracySec=puede agrupar ejecuciones para ahorrar recursos. Valida expresiones consystemd-analyze calendar.
Sintaxis básica
OnCalendar=CALENDAR_EXPRESSION
Puedes usar fecha, hora, día de la semana o combinaciones.
Ejemplos validados
| Expresión | Significado |
|---|---|
OnCalendar=*:03 | Cada hora, en el minuto 3 |
OnCalendar=*-*-* *:00:00 | Cada hora en punto |
OnCalendar=*-*-* *:*:00 | Cada minuto, al segundo 0 |
OnCalendar=Mon..Fri 09:00 | De lunes a viernes a las 09:00 |
OnCalendar=Sun 18:00 | Domingos a las 18:00 |
OnCalendar=*-*-01 00:00 | Día 1 de cada mes a medianoche |
OnCalendar=*-*-* 00/2:00:00 | Cada 2 horas |
OnCalendar=*:0/5 | Cada 5 minutos |
Reglas útiles
| Recurso | Qué hace | Ejemplo |
|---|---|---|
* | Cualquier valor | *-*-* |
/ | Intervalo | 00/2:00:00 |
.. | Rango | Mon..Fri |
, | Lista | Mon,Wed,Fri |
Ejemplo combinado:
OnCalendar=Mon..Fri *-*-* 09..17:00/15
Lunes a viernes, de 09:00 a 17:00, cada 15 minutos.
Validar antes de usar
systemd-analyze calendar 'Mon..Fri 09:00'
systemd-analyze calendar '*-*-* *:0/5'
systemd-analyze calendar '*-*-01 00:00'
El comando muestra la forma normalizada y la próxima ejecución calculada.
Ejemplo real de .timer
[Unit]
Description=Run funding updater every minute
[Timer]
OnCalendar=*:0/1
Persistent=true
[Install]
WantedBy=timers.target
Notas:
-
OnCalendar=*:0/1ejecuta una vez por minuto. -
Persistent=trueintenta recuperar ejecuciones perdidas si el timer estaba inactivo. -
El
.serviceasociado debe existir con el mismo nombre o indicarse conUnit=.
Comandos útiles
| Comando | Uso |
|---|---|
systemd-analyze calendar 'EXPR' | Validar expresión |
sudo systemctl daemon-reload | Recargar unidades tras editar |
sudo systemctl enable --now NOMBRE.timer | Activar timer ahora y al arranque |
systemctl list-timers --all | Ver timers y próxima ejecución |
journalctl -u NOMBRE.service -f | Seguir logs del servicio ejecutado |
Errores comunes
-
Poner lógica de shell en
OnCalendar=. La lógica va en el.service. -
No validar expresiones antes de producción.
-
Olvidar que
.timery.serviceson archivos distintos. -
Esperar precisión exacta al segundo sin revisar
AccuracySec=. -
Usar
RemainAfterExit=yesen servicios repetitivos y bloquear ejecuciones siguientes.
Referencias
-
systemd.timer: https://man7.org/linux/man-pages/man5/systemd.timer.5.html
-
systemd.time: https://man7.org/linux/man-pages/man7/systemd.time.7.html
-
systemd-analyze: https://man7.org/linux/man-pages/man1/systemd-analyze.1.html
- EOF -