Sintaxis de OnCalendar
El formato es [DíaDeLaSemana] Fecha Hora, con cada parte opcional: Mon..Fri *-*-* 06:30:00. Los días de la semana usan nombres de tres letras con rangos .. y comas. La fecha es YYYY-MM-DD con * para cualquiera; la hora es HH:MM:SS (los segundos son 00 por defecto). Cualquier campo acepta listas (1,15), rangos (8..18) y pasos (*/15 o 0/15, 8..18/2). Atajos: minutely, hourly, daily, weekly, monthly, yearly, quarterly. Un nombre de zona al final aplica la expresión en esa zona (*-*-* 09:00 Europe/Madrid).
| Cron | OnCalendar |
|---|---|
| */5 * * * * | *-*-* *:*/5:00 |
| 0 * * * * | hourly |
| 30 6 * * 1-5 | Mon..Fri *-*-* 06:30:00 |
| 0 9 1 * * | *-*-01 09:00:00 |
| 0 3 * * 0 | Sun *-*-* 03:00:00 |
| 0 0 L * * | *-*~01 00:00:00 (último día del mes: ~ cuenta desde el final) |
Lo que hacen los temporizadores y cron no
- Persistent=true: si la máquina estaba apagada cuando el temporizador debía dispararse, se ejecuta en el siguiente arranque. Cron simplemente lo pierde (para eso existe anacron).
- RandomizedDelaySec=: reparte las ejecuciones en una ventana para que una flota no golpee el servidor en el mismo segundo.
- AccuracySec=: un minuto por defecto; pon
1ssi importa la hora exacta, o más para agrupar despertares y ahorrar energía. - Los registros van al journal (
journalctl -u nombre.service), el trabajo se ejecuta con el sandboxing, las dependencias y los límites de recursos del servicio, ysystemctl list-timersmuestra las próximas y últimas ejecuciones.
Comprobar una expresión
systemd-analyze calendar "Mon..Fri *-*-* 06:30" imprime la forma normalizada y la próxima ejecución, que es lo que reproduce esta página. Tras instalar un temporizador: systemctl daemon-reload && systemctl enable --now nombre.timer, y luego systemctl list-timers --all.
Preguntas
¿Por qué mi temporizador se ejecuta una vez y nunca más?
Normalmente el temporizador se inició pero no se habilitó (systemctl enable --now nombre.timer), o el servicio que dispara es un oneshot sin unidad timer correspondiente. Comprueba systemctl list-timers y journalctl -u nombre.timer.
¿Cómo ejecuto un temporizador como usuario normal?
Pon las unidades en ~/.config/systemd/user/, usa systemctl --user y ejecuta loginctl enable-linger $USER para que se disparen sin una sesión de inicio activa.
¿OnCalendar usa la zona horaria del sistema?
Sí, a menos que la expresión termine con un nombre de zona, que systemd 243+ admite. Las imágenes de contenedores y de la nube suelen estar en UTC; fija la zona explícitamente si la planificación se entiende en hora local.
¿Cómo expreso «cada día laborable a las 9 y a las 17»?
Mon..Fri *-*-* 09,17:00:00. Las listas funcionan en cualquier campo.