Systemd timers: la alternativa moderna a cron que necesitabas
Etiquetas: automatización, linux, servidor, systemdPor 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 medianocheweekly→ cada lunes a medianochehourly→ cada hora*-*-* 03:00:00→ todos los días a las 3 AMMon *-*-* 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.