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ística | Cron | systemd Timers |
|---|---|---|
| Logs | Archivos separados | journalctl |
| Dependencias | No | Sí |
| Persistencia | No | Sí (opcional) |
| Flexibilidad | Limitada | Alta |
| Simplicidad | Simple | Más complejo |
| Disponibilidad | En todos lados | Requiere 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