Saltar al contenido principal

Capítulo 8.3 - Cron Avanzado y systemd Timers

Objetivos de Aprendizaje​

Al final de este capítulo, usted será capaz de:

  • Utilizar cron del sistema (/etc/crontab, /etc/cron.d)
  • Comprender anacron
  • Crear systemd timers
  • Comparar cron vs systemd timers
  • Gestionar los logs de cron
  • Implementar tareas programadas avanzadas

Cron del Sistema​

/etc/crontab​

Formato con usuario:

# /etc/crontab
# Formato: MIN HORA DÍA MES DÍA_SEMANA USUARIO COMANDO

# Ejemplo
0 2 * * * root /usr/local/bin/backup.sh
*/15 * * * * www-data /usr/local/bin/check.sh

Editar:

sudo nano /etc/crontab

/etc/cron.d/​

Directorio para archivos cron del sistema:

# Crear archivo
sudo nano /etc/cron.d/mi-tarea

# Formato (con usuario)
0 2 * * * user1 /usr/local/bin/script.sh

# Permisos importantes
sudo chmod 644 /etc/cron.d/mi-tarea

Ventajas:

  • Organización por archivo
  • Fácil de gestionar
  • No requiere crontab -e

Directorios Especiales​

/etc/cron.hourly/   # Ejecutado cada hora (00:00)
/etc/cron.daily/ # Ejecutado cada día (06:25)
/etc/cron.weekly/ # Ejecutado cada semana (domingo 06:47)
/etc/cron.monthly/ # Ejecutado cada mes (1º a las 06:52)

Colocar scripts ejecutables (sin extensión .sh)


Anacron​

Para Sistemas No 24/7​

Anacron ejecuta tareas incluso si el sistema estuvo apagado.

# Configuración
/etc/anacrontab

# Formato
# periodo retraso identificador comando
1 5 backup /usr/local/bin/backup.sh
7 10 weekly-clean /usr/local/bin/cleanup.sh

Funcionamiento:

  • Verifica si la tarea fue ejecutada en el periodo
  • Si no, ejecuta después del retraso
  • Ideal para laptops, sistemas intermitentes

systemd Timers​

Alternativa Moderna a Cron​

Ventajas:

  • Integración con systemd
  • Logs con journalctl
  • Dependencias entre unidades
  • Más flexible

Crear un Timer​

Servicio:

# /etc/systemd/system/backup.service
[Unit]
Description=Backup Diario

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

Timer:

# /etc/systemd/system/backup.timer
[Unit]
Description=Timer para Backup Diario
Requires=backup.service

[Timer]
OnCalendar=daily
OnCalendar=02:00
Persistent=true

[Install]
WantedBy=timers.target

Activar:

sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer

Sintaxis OnCalendar​

# Formato: DayOfWeek Year-Month-Day Hour:Minute:Second

# Todos los días a las 2h
OnCalendar=daily
OnCalendar=02:00

# Todos los lunes a las 9h
OnCalendar=Mon *-*-* 09:00:00

# El 1º de cada mes
OnCalendar=monthly
OnCalendar=*-*-01 00:00:00

# Cada hora
OnCalendar=hourly

# Cada 15 minutos
OnCalendar=*:0/15

Opciones de Timer​

[Timer]
# Programación
OnCalendar=daily
OnBootSec=10min
OnUnitActiveSec=1h

# Persistencia (ejecuta si se perdió)
Persistent=true

# Precisión (ejecución aproximada)
AccuracySec=1min

# Aleatorización
RandomizedDelaySec=5min

Comparación Cron vs Timers​

CaracterísticaCronsystemd Timers
LogsArchivos separadosjournalctl
DependenciasNoSí
PersistenciaNoSí (opcional)
FlexibilidadLimitadaAlta
SimplicidadSimpleMás complejo
DisponibilidadEn todos ladosRequiere systemd

Gestión de Logs​

Logs de Cron​

# Logs del sistema
/var/log/syslog # Ubuntu/Debian
/var/log/cron # Red Hat/CentOS

# Ver logs de cron
sudo grep CRON /var/log/syslog
sudo tail -f /var/log/syslog | grep CRON

Logs de systemd Timers​

# Logs del timer
sudo journalctl -u backup.timer

# Logs del servicio
sudo journalctl -u backup.service

# Seguir
sudo journalctl -u backup.timer -f

# Desde fecha
sudo journalctl -u backup.timer --since "2024-01-01"

Ejemplos Avanzados​

Backup con Timer​

Servicio:

[Unit]
Description=Backup Automático

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

Timer:

[Unit]
Description=Timer Backup Diario

[Timer]
OnCalendar=daily
OnCalendar=02:00
Persistent=true
RandomizedDelaySec=30min

[Install]
WantedBy=timers.target

Limpieza con Cron​

# /etc/cron.daily/cleanup
#!/bin/bash
# Limpieza diaria

find /var/log -name "*.log" -mtime +30 -delete
find /tmp -type f -mtime +7 -delete

Monitoreo con Timer​

Servicio:

[Unit]
Description=Check Disk Space

[Service]
Type=oneshot
ExecStart=/usr/local/bin/check-disk.sh

Timer:

[Unit]
Description=Timer Check Disk

[Timer]
OnCalendar=*:0/15
OnBootSec=5min

[Install]
WantedBy=timers.target

Buenas Prácticas​

Cron​

  • Utilizar rutas absolutas
  • Redirigir salida/errores
  • Probar scripts manualmente
  • Documentar en comentarios
  • Verificar logs regularmente

systemd Timers​

  • Crear servicio separado
  • Utilizar Persistent=true si es necesario
  • Configurar RandomizationDelay
  • Probar primero con OnBootSec
  • Monitorear con journalctl

Resumen​

En este capítulo, usted ha aprendido:

Cron del sistema: /etc/crontab, /etc/cron.d/, directorios especiales
Anacron: Para sistemas intermitentes
systemd timers: Alternativa moderna con dependencias
Sintaxis: OnCalendar para programación flexible
Logs: journalctl para timers, /var/log para cron
Comparación: Cron simple, timers más potentes
Práctica: Backup, limpieza, monitoreo programados


Próximos Pasos​

Módulo 9: Seguridad del Sistema
Módulo 10: Gestión de Paquetes


Capítulo creado el: Diciembre 2024