07 · Timers (tareas programadas)
Los timers son el reemplazo moderno de cron. Sirven para ejecutar una tarea en horarios concretos: backups diarios, limpiezas semanales, scripts a medianoche. Se combinan con un .service.
Concepto: servicio + timer
Se usan dos archivos:
- Un
.serviceque define qué ejecutar. - Un
.timerque define cuándo ejecutarlo.
Systemd activa el .service automáticamente cuando el .timer lo indica.
Ejemplo: backup diario a las 22:00
Archivo 1: el servicio
sudo nano /etc/systemd/system/backup.service
[Unit]
Description=Backup diario de mi carpeta Documentos
[Service]
Type=oneshot
User=tu_usuario
ExecStart=/home/tu_usuario/scripts/backup.sh
Y el script ~/scripts/backup.sh:
#!/bin/bash
mkdir -p /home/tu_usuario/backups
tar -czf /home/tu_usuario/backups/docs-$(date +%Y%m%d).tar.gz /home/tu_usuario/Documentos
chmod +x ~/scripts/backup.sh
Archivo 2: el timer
sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Ejecuta el backup todos los días a las 22:00
[Timer]
OnCalendar=*-*-* 22:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
Activar el timer (no el servicio)
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
Se habilita el timer, no el servicio. Si habilitas el
.service, se ejecutará cada vez que arranques, no según el calendario.
Verificar
systemctl list-timers # todos los timers y próxima ejecución
systemctl list-timers backup.timer # solo el tuyo
systemctl status backup.timer
journalctl -u backup.service # ver ejecuciones pasadas
La directiva OnCalendar
Formato: DíaDeSemana Año-Mes-Día Hora:Minuto:Segundo. Los * significan "cualquiera".
| Expresión | Significado |
|---|---|
*-*-* 22:00:00 | Todos los días a las 22:00 |
*-*-* 03:00:00 | Todos los días a las 3:00 |
Mon *-*-* 08:00:00 | Lunes a las 8:00 |
Mon,Fri *-*-* 18:00 | Lunes y viernes a las 18:00 |
*-*-01 04:00:00 | El día 1 de cada mes a las 4:00 |
*-*-* *:00:00 | Cada hora en punto |
*-*-* *:00/15:00 | Cada 15 minutos |
hourly | Atajo: cada hora |
daily | Atajo: cada día a medianoche |
weekly | Atajo: cada lunes a medianoche |
monthly | Atajo: el día 1 de cada mes |
Puedes probar la expresión con
systemd-analyze calendar "*-*-* 22:00:00". Te dirá la próxima ejecución y si la expresión es válida.
Otras directivas del [Timer]
| Directiva | Efecto |
|---|---|
OnBootSec=5min | Ejecutar 5 minutos tras el arranque |
OnUnitActiveSec=1h | Ejecutar 1 hora después de la última vez |
OnStartupSec=1min | 1 minuto tras arrancar systemd (no el equipo) |
Persistent=true | Si el equipo estaba apagado a la hora programada, se ejecuta al encender |
RandomizedDelaySec=10min | Añade un retardo aleatorio (para no saturar) |
AccuracySec=1min | Precisión. Bajar a 1s consume más |
Timer de usuario (sin sudo)
Igual que con los servicios, puedes crear timers de usuario.
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/mi-backup.service
nano ~/.config/systemd/user/mi-backup.timer
En el [Install] del timer pon WantedBy=timers.target. Gestiona con:
systemctl --user daemon-reload
systemctl --user enable --now mi-backup.timer
systemctl --user list-timers
🧪 Práctica sugerida
- Crea un script que escriba la fecha en un log.
- Crea su
.service(Type=oneshot). - Crea su
.timerconOnCalendar=*-*-* *:00/2:00(cada 2 minutos). - Actívalo con
enable --nowy espera 4 minutos. journalctl -u tu-serviciodebe mostrar ejecuciones.- Cuando termines,
sudo systemctl disable --now tu.timer.