~/docs /DevOps/Systemd/Crear timer

DevOps

Crear timer

Imported from Notion: Crear timer

updated:: 2026.07.10

Qué resuelve

Crear un .timer de systemd para ejecutar un .service por calendario o intervalo, con activación, validación y debugging.


Idea base

Un timer normalmente activa un servicio con el mismo nombre:

mi-job.timer -> mi-job.service

El .timer decide cuándo. El .service decide qué ejecutar.


Servicio asociado

Archivo:

/etc/systemd/system/mi-job.service

Contenido:

[Unit]
Description=Ejecuta mi job programado

[Service]
Type=oneshot
User=deploy
WorkingDirectory=/opt/mi-job
ExecStart=/opt/mi-job/run.sh

Timer cada 5 minutos

Archivo:

/etc/systemd/system/mi-job.timer

Contenido:

[Unit]
Description=Ejecuta mi job cada 5 minutos

[Timer]
OnCalendar=*:0/5
Persistent=true

[Install]
WantedBy=timers.target

Validar expresión:

systemd-analyze calendar '*:0/5'

Activar:

sudo systemctl daemon-reload
sudo systemctl enable --now mi-job.timer
systemctl list-timers --all | grep mi-job

Timer tras boot y luego periódico

[Timer]
OnBootSec=2min
OnUnitActiveSec=10min

Útil para jobs que deben arrancar tras boot y repetirse por intervalo.


Comandos de operación

ComandoUso
systemctl status mi-job.timerEstado del timer
systemctl status mi-job.serviceEstado del servicio lanzado
systemctl list-timers --allPróximas ejecuciones
journalctl -u mi-job.service -fLogs del job
sudo systemctl start mi-job.serviceLanzar manualmente el job
sudo systemctl disable --now mi-job.timerParar y deshabilitar

Opciones útiles

OpciónUso
OnCalendar=Calendario tipo cron/systemd
OnBootSec=Tiempo tras boot
OnUnitActiveSec=Intervalo desde última activación
Persistent=trueRecuperar ejecuciones perdidas
RandomizedDelaySec=Repartir carga
AccuracySec=Ajustar precisión
Unit=Activar una unidad con nombre distinto

Errores comunes

  • Poner ExecStart en el .timer.

  • No crear el .service asociado.

  • Usar Type=simple para jobs que terminan rápido en vez de oneshot.

  • No validar OnCalendar.

  • Mirar logs del .timer y no del .service.

  • Usar un servicio con RemainAfterExit=yes para ejecuciones repetidas.


Checklist final

  • El .service funciona si lo lanzo manualmente.

  • El .timer tiene expresión validada.

  • Ejecuté sudo systemctl daemon-reload.

  • Activé con enable --now.

  • Verifiqué list-timers.

  • Revisé logs del .service.


Referencias

- EOF -