~/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
| Comando | Uso |
|---|---|
systemctl status mi-job.timer | Estado del timer |
systemctl status mi-job.service | Estado del servicio lanzado |
systemctl list-timers --all | Próximas ejecuciones |
journalctl -u mi-job.service -f | Logs del job |
sudo systemctl start mi-job.service | Lanzar manualmente el job |
sudo systemctl disable --now mi-job.timer | Parar y deshabilitar |
Opciones útiles
| Opción | Uso |
|---|---|
OnCalendar= | Calendario tipo cron/systemd |
OnBootSec= | Tiempo tras boot |
OnUnitActiveSec= | Intervalo desde última activación |
Persistent=true | Recuperar ejecuciones perdidas |
RandomizedDelaySec= | Repartir carga |
AccuracySec= | Ajustar precisión |
Unit= | Activar una unidad con nombre distinto |
Errores comunes
-
Poner
ExecStarten el.timer. -
No crear el
.serviceasociado. -
Usar
Type=simplepara jobs que terminan rápido en vez deoneshot. -
No validar
OnCalendar. -
Mirar logs del
.timery no del.service. -
Usar un servicio con
RemainAfterExit=yespara ejecuciones repetidas.
Checklist final
-
El
.servicefunciona si lo lanzo manualmente. -
El
.timertiene expresión validada. -
Ejecuté
sudo systemctl daemon-reload. -
Activé con
enable --now. -
Verifiqué
list-timers. -
Revisé logs del
.service.
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
- EOF -