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:

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ónSignificado
*-*-* 22:00:00Todos los días a las 22:00
*-*-* 03:00:00Todos los días a las 3:00
Mon *-*-* 08:00:00Lunes a las 8:00
Mon,Fri *-*-* 18:00Lunes y viernes a las 18:00
*-*-01 04:00:00El día 1 de cada mes a las 4:00
*-*-* *:00:00Cada hora en punto
*-*-* *:00/15:00Cada 15 minutos
hourlyAtajo: cada hora
dailyAtajo: cada día a medianoche
weeklyAtajo: cada lunes a medianoche
monthlyAtajo: 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]

DirectivaEfecto
OnBootSec=5minEjecutar 5 minutos tras el arranque
OnUnitActiveSec=1hEjecutar 1 hora después de la última vez
OnStartupSec=1min1 minuto tras arrancar systemd (no el equipo)
Persistent=trueSi el equipo estaba apagado a la hora programada, se ejecuta al encender
RandomizedDelaySec=10minAñade un retardo aleatorio (para no saturar)
AccuracySec=1minPrecisió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

  1. Crea un script que escriba la fecha en un log.
  2. Crea su .service (Type=oneshot).
  3. Crea su .timer con OnCalendar=*-*-* *:00/2:00 (cada 2 minutos).
  4. Actívalo con enable --now y espera 4 minutos.
  5. journalctl -u tu-servicio debe mostrar ejecuciones.
  6. Cuando termines, sudo systemctl disable --now tu.timer.
Anterior← Crear servicio