Saltar al contenido principal

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​

  1. ¿Por qué usar rutas absolutas en cron?

    • Cron no tiene el mismo PATH que su shell
    • Las rutas relativas pueden fallar
  2. ¿Cuál es la diferencia entre crontab de usuario y del sistema?

    • Usuario: crontab -e (archivo en /var/spool/cron/)
    • Sistema: /etc/crontab o /etc/cron.d/
  3. ¿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 crontab
  • man 5 crontab - Formato del archivo crontab
  • systemctl --user list-timers - Ver los timers de systemd
  • Guía de Cron en Ubuntu

Lab creado el: Diciembre 2024 - Probado en Ubuntu 24.04