Lab 6.4 - Cron y Crontab
Objetivos del Lab
Al final de este laboratorio, usted será capaz de:
- Comprender el sistema cron
- Crear tareas programadas con crontab
- Gestionar los crontabs de usuario y del sistema
- Monitorizar la ejecución de tareas cron
- Solucionar problemas comunes
- Utilizar systemd timers (alternativa moderna)
Duración Estimada
45-60 minutos
Requisitos Previos
- Ubuntu 24.04 instalado y funcional
- Acceso de usuario con sudo
- Terminal abierto
- Conocimientos básicos de línea de comandos
Ejercicio 1: Introducción a Cron
Paso 1: Verificar el Servicio Cron
# Verificar que cron está instalado y activo
systemctl status cron
# Si no está instalado (normalmente viene por defecto)
sudo apt update
sudo apt install cron
# Iniciar y habilitar
sudo systemctl enable cron
sudo systemctl start cron
Paso 2: Comprender la Estructura
# Ver las crontabs del sistema
ls -la /etc/cron.*
# Ver las crontabs de usuario
ls -la /var/spool/cron/crontabs/
# Ver el crontab del usuario actual
crontab -l
Ejercicio 2: Crontab de Usuario
Paso 1: Editar el Crontab
# Editar el crontab del usuario actual
crontab -e
# La primera vez, elija un editor (se recomienda nano)
Paso 2: Sintaxis de Crontab
Formato: minuto hora día mes día-semana comando
# Ejemplos de sintaxis:
# * * * * * = Cada minuto
# 0 * * * * = Cada hora (minuto 0)
# 0 0 * * * = Todos los días a medianoche
# 0 0 * * 0 = Todos los domingos a medianoche
# */5 * * * * = Cada 5 minutos
Paso 3: Crear una Tarea Simple
# Crear un script de prueba
cat > ~/test-cron.sh << 'EOF'
#!/bin/bash
echo "Cron ejecutado a $(date)" >> ~/cron-test.log
EOF
chmod +x ~/test-cron.sh
# Añadir al crontab (ejecutar cada minuto para probar)
crontab -e
# Añadir esta línea:
# * * * * * /home/$USER/test-cron.sh
# Ver el crontab
crontab -l
# Espere 2-3 minutos, luego verifique
cat ~/cron-test.log
Ejercicio 3: Tareas Comunes
Paso 1: Backup Diario
# Crear un script de backup
cat > ~/backup-daily.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="$HOME/backups"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" ~/Documents 2>/dev/null
echo "Backup creado: backup-$DATE.tar.gz"
EOF
chmod +x ~/backup-daily.sh
# Añadir al crontab (todos los días a las 2 de la mañana)
crontab -e
# Añadir:
# 0 2 * * * /home/$USER/backup-daily.sh >> /home/$USER/backup.log 2>&1
Paso 2: Limpieza Semanal
# Script de limpieza
cat > ~/cleanup-weekly.sh << 'EOF'
#!/bin/bash
# Eliminar archivos temporales > 7 días
find ~/tmp -type f -mtime +7 -delete 2>/dev/null
# Limpiar logs antiguos
find ~/logs -name "*.log" -mtime +30 -delete 2>/dev/null
echo "Limpieza realizada: $(date)"
EOF
chmod +x ~/cleanup-weekly.sh
# Añadir al crontab (todos los domingos a las 3h)
crontab -e
# Añadir:
# 0 3 * * 0 /home/$USER/cleanup-weekly.sh
Paso 3: Monitorización del Sistema
# Script de monitorización
cat > ~/monitor-system.sh << 'EOF'
#!/bin/bash
LOG="$HOME/system-monitor.log"
{
echo "=== $(date) ==="
echo "CPU: $(top -bn1 | grep 'Cpu(s)' | awk '{print $2}')"
echo "Memoria: $(free -h | grep Mem | awk '{print $3"/"$2}')"
echo "Disco: $(df -h / | tail -1 | awk '{print $5}')"
echo "---"
} >> "$LOG"
EOF
chmod +x ~/monitor-system.sh
# Ejecutar cada 5 minutos
crontab -e
# Añadir:
# */5 * * * * /home/$USER/monitor-system.sh
Ejercicio 4: Variables de Entorno
Paso 1: Configurar el Entorno
# El crontab no tiene el mismo entorno que su shell
# Debe definir las variables necesarias
crontab -e
# Añadir en la parte superior del archivo:
# PATH=/usr/bin:/bin
# SHELL=/bin/bash
# HOME=/home/$USER
# MAILTO=su-email@example.com
# Ejemplo con PATH definido
# */5 * * * * /usr/bin/curl http://example.com >> /tmp/curl.log 2>&1
Paso 2: Rutas Absolutas
# Siempre use rutas absolutas en cron
# ❌ Incorrecto:
# * * * * * script.sh
# ✅ Correcto:
# * * * * * /home/$USER/script.sh
# O definir en el script:
# #!/bin/bash
# cd /home/$USER
# ./script.sh
Ejercicio 5: Crontab del Sistema
Paso 1: Crontab del Sistema
# Editar el crontab del sistema
sudo crontab -e
# O crear un archivo en /etc/cron.d/
sudo nano /etc/cron.d/mi-tarea
# Formato con usuario:
# * * * * * usuario /ruta/al/script.sh
# Ejemplo: backup del sistema todos los días a la 1h
# 0 1 * * * root /usr/local/bin/system-backup.sh
Paso 2: Directorios Cron del Sistema
# /etc/cron.daily/ - Ejecución diaria
ls -la /etc/cron.daily/
# /etc/cron.weekly/ - Ejecución semanal
ls -la /etc/cron.weekly/
# /etc/cron.monthly/ - Ejecución mensual
ls -la /etc/cron.monthly/
# /etc/cron.hourly/ - Ejecución por hora
ls -la /etc/cron.hourly/
# Crear un script en cron.daily
sudo nano /etc/cron.daily/mi-script
# Añadir:
#!/bin/bash
# Su script aquí
# Hacerlo ejecutable
sudo chmod +x /etc/cron.daily/mi-script
Ejercicio 6: Monitorización y Logs
Paso 1: Ver los Logs de Cron
# Ubuntu 24.04 utiliza systemd, los logs están en journalctl
sudo journalctl -u cron
# Ver las últimas entradas
sudo journalctl -u cron -n 50
# Seguir en tiempo real
sudo journalctl -u cron -f
# Filtrar por usuario
sudo journalctl -u cron | grep $USER
# Ver las ejecuciones de hoy
sudo journalctl -u cron --since today
Paso 2: Verificar la Ejecución
# Script para verificar si cron ejecutó una tarea
cat > ~/check-cron.sh << 'EOF'
#!/bin/bash
SCRIPT="$HOME/test-cron.sh"
LOG="$HOME/cron-test.log"
# Verificar última ejecución
if [ -f "$LOG" ]; then
LAST_RUN=$(tail -1 "$LOG" | awk '{print $4, $5}')
echo "Última ejecución: $LAST_RUN"
else
echo "No se encontró ninguna ejecución"
fi
# Verificar en los logs del sistema
echo "Logs del sistema:"
sudo journalctl -u cron | grep "$SCRIPT" | tail -5
EOF
chmod +x ~/check-cron.sh
./check-cron.sh
Ejercicio 7: Solución de Problemas
Paso 1: Problemas Comunes
# Problema: El script no se ejecuta
# Solución 1: Verificar los permisos
chmod +x ~/mi-script.sh
# Solución 2: Verificar las rutas
which comando-en-script
# Solución 3: Probar manualmente
bash ~/mi-script.sh
# Solución 4: Verificar los logs
sudo journalctl -u cron | tail -20
Paso 2: Debug
# Añadir logging en el script
cat > ~/script-debug.sh << 'EOF'
#!/bin/bash
set -x # Modo debug
exec > /tmp/script-debug.log 2>&1
echo "Inicio: $(date)"
# Su código aquí
echo "Fin: $(date)"
EOF
# En crontab, redirigir también
# * * * * * /home/$USER/script-debug.sh >> /tmp/cron-debug.log 2>&1
Ejercicio 8: systemd Timers (Alternativa Moderna)
Paso 1: Crear un Timer
# Crear un servicio
cat > ~/.config/systemd/user/backup.service << 'EOF'
[Unit]
Description=Backup diario
[Service]
Type=oneshot
ExecStart=/home/$USER/backup-daily.sh
EOF
# Crear un timer
cat > ~/.config/systemd/user/backup.timer << 'EOF'
[Unit]
Description=Timer para backup diario
[Timer]
OnCalendar=daily
OnCalendar=02:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# Recargar y activar
systemctl --user daemon-reload
systemctl --user enable backup.timer
systemctl --user start backup.timer
# Verificar
systemctl --user list-timers
Verificación
Checklist
Verifique que usted puede:
- Editar un crontab de usuario
- Comprender la sintaxis de cron
- Crear tareas programadas
- Configurar variables de entorno
- Ver los logs de cron
- Solucionar problemas comunes
- Utilizar systemd timers (opcional)
Preguntas de Reflexión
-
¿Por qué usar rutas absolutas en cron?
- Cron no tiene el mismo PATH que su shell
- Las rutas relativas pueden fallar
-
¿Cuál es la diferencia entre crontab de usuario y del sistema?
- Usuario:
crontab -e(archivo en /var/spool/cron/) - Sistema:
/etc/crontabo/etc/cron.d/
- Usuario:
-
¿Cuándo usar systemd timers vs cron?
- systemd timers: Más moderno, mejor integración
- cron: Más simple, soporte universal
Próximos Pasos
- Capítulo 8.3: Cron Avanzado y systemd Timers
- Módulo 11: Monitorización de Crons y Alertas
- Módulo 12: Automatización Completa
Recursos Ubuntu 24.04
man crontab- Documentación de crontabman 5 crontab- Formato del archivo crontabsystemctl --user list-timers- Ver los timers de systemd- Guía de Cron en Ubuntu
Lab creado el: Diciembre 2024 - Probado en Ubuntu 24.04