~/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 con systemd-analyze calendar.


Sintaxis básica

OnCalendar=CALENDAR_EXPRESSION

Puedes usar fecha, hora, día de la semana o combinaciones.


Ejemplos validados

ExpresiónSignificado
OnCalendar=*:03Cada hora, en el minuto 3
OnCalendar=*-*-* *:00:00Cada hora en punto
OnCalendar=*-*-* *:*:00Cada minuto, al segundo 0
OnCalendar=Mon..Fri 09:00De lunes a viernes a las 09:00
OnCalendar=Sun 18:00Domingos a las 18:00
OnCalendar=*-*-01 00:00Día 1 de cada mes a medianoche
OnCalendar=*-*-* 00/2:00:00Cada 2 horas
OnCalendar=*:0/5Cada 5 minutos

Reglas útiles

RecursoQué haceEjemplo
*Cualquier valor*-*-*
/Intervalo00/2:00:00
..RangoMon..Fri
,ListaMon,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/1 ejecuta una vez por minuto.

  • Persistent=true intenta recuperar ejecuciones perdidas si el timer estaba inactivo.

  • El .service asociado debe existir con el mismo nombre o indicarse con Unit=.


Comandos útiles

ComandoUso
systemd-analyze calendar 'EXPR'Validar expresión
sudo systemctl daemon-reloadRecargar unidades tras editar
sudo systemctl enable --now NOMBRE.timerActivar timer ahora y al arranque
systemctl list-timers --allVer timers y próxima ejecución
journalctl -u NOMBRE.service -fSeguir 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 .timer y .service son archivos distintos.

  • Esperar precisión exacta al segundo sin revisar AccuracySec=.

  • Usar RemainAfterExit=yes en servicios repetitivos y bloquear ejecuciones siguientes.


Referencias

- EOF -