bitlvl
ES

Explicador de OnCalendar de temporizadores systemd

Escribe una expresión OnCalendar o pega una línea cron para convertirla. Obtienes el significado, las próximas diez ejecuciones y un par .timer + .service completo para dejar en /etc/systemd/system.

Archivos de unidad

  

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

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).

CronOnCalendar
*/5 * * * **-*-* *:*/5:00
0 * * * *hourly
30 6 * * 1-5Mon..Fri *-*-* 06:30:00
0 9 1 * **-*-01 09:00:00
0 3 * * 0Sun *-*-* 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 1s si 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, y systemctl list-timers muestra 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.