Systemd timers: la alternativa moderna a cron que necesitabas

Por qué dejé cron

Llevo años usando cron en mis servidores. Es simple, confiable y funciona. Pero hace poco descubrí systemd timers y no vuelvo atrás. La razón principal: logs integrados en journald, sin archivos .log dando vueltas por el sistema, y mejor control sobre qué pasa cuando el servidor arranca o reinicia.

🎧 Escucha el resumen · 2 min

Narración generada con IA

En mi caso específico, tenía un backup que no se ejecutaba si el servidor estaba apagado a la hora programada. Con cron, simplemente se perdía. Con systemd timers y Persistent=true, la tarea se ejecuta en cuanto el servidor se enciende.

Estructura básica: .service + .timer

Systemd necesita dos archivos:

El servicio (/etc/systemd/system/mibackup.service):

[Unit]
Description=Backup diario de datos
After=network.target

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup.sh
StandardOutput=journal
StandardError=journal

El timer (/etc/systemd/system/mibackup.timer):

[Unit]
Description=Ejecuta backup diariamente

[Timer]
OnCalendar=daily
OnCalendar=*-*-* 03:00:00
Persistent=true
Accuracy=1min

[Install]
WantedBy=timers.target

Luego:

sudo systemctl daemon-reload
sudo systemctl enable --now mibackup.timer

OnCalendar: la sintaxis que necesitas

OnCalendar es el cron de systemd, pero más legible:

  • daily → todos los días a medianoche
  • weekly → cada lunes a medianoche
  • hourly → cada hora
  • *-*-* 03:00:00 → todos los días a las 3 AM
  • Mon *-*-* 14:30:00 → cada lunes a las 14:30
  • *-01,04,07,10-01 00:00:00 → primero de cada trimestre

Persistent=true: el cambio que me convenció

Por defecto, si tu servidor está apagado cuando se programa una tarea, systemd simplemente la ignora. Con Persistent=true, systemd recuerda y ejecuta la tarea la próxima vez que arranque.

[Timer]
OnCalendar=daily
Persistent=true

Type=oneshot: para tareas que terminan

El parámetro Type=oneshot en el .service indica que el proceso terminará. Es lo normal para scripts de backup, sincronización, etc.

Ver logs sin archivos externos

Los logs van directo a journald:

journalctl -u mibackup.service -n 50
journalctl -u mibackup.service -f
journalctl -u mibackup.service --since "2 hours ago"
journalctl -u mibackup.service -p err

Consejo final

Antes de depender de un timer, pruébalo manualmente:

sudo systemctl start mibackup.service
journalctl -u mibackup.service -n 20

Systemd timers no es la panacea, pero para tareas programadas en servidores modernos, es superior a cron en casi todos los aspectos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio