Capítulo 6.4 - Funciones y Cron
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Crear y utilizar funciones Bash
- Comprender los parámetros de funciones
- Programar tareas con cron
- Utilizar crontab
- Comprender la sintaxis de cron
Funciones Bash
Definición
#!/bin/bash
# Sintaxis 1
nombre_funcion() {
comandos
}
# Sintaxis 2
function nombre_funcion {
comandos
}
# Sintaxis 3 (portable)
function nombre_funcion() {
comandos
}
Ejemplo Simple
#!/bin/bash
# Función simple
hola() {
echo "Hola $1!"
}
# Llamada
hola "Linux"
hola "Mundo"
Parámetros
#!/bin/bash
# Parámetros: $1, $2, etc. (locales a la función)
mi_funcion() {
echo "Primero: $1"
echo "Segundo: $2"
echo "Todos: $@"
echo "Cantidad: $#"
}
# Llamada
mi_funcion "arg1" "arg2" "arg3"
Valor de Retorno
#!/bin/bash
# Código de retorno (0-255)
es_archivo() {
if [ -f "$1" ]; then
return 0 # Éxito
else
return 1 # Fallo
fi
}
# Uso
if es_archivo "/etc/passwd"; then
echo "Archivo existe"
fi
Variables Locales
#!/bin/bash
# Variable local (ámbito función)
mi_funcion() {
local var_local="valor"
echo "Local: $var_local"
}
# Variable global
var_global="global"
mi_funcion
echo "Global: $var_global"
Ejemplos de Funciones
Función Utilitaria
#!/bin/bash
# Logger con timestamp
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
# Uso
log "Inicio del script"
log "Error: Archivo no encontrado"
log "Fin del script"
Función de Verificación
#!/bin/bash
# Verificar si el usuario existe
usuario_existe() {
id "$1" &>/dev/null
return $?
}
# Uso
if usuario_existe "user1"; then
echo "Usuario existe"
else
echo "Usuario no existe"
fi
Función con Retorno de Valor
#!/bin/bash
# Retornar un valor (vía echo)
calcular() {
local resultado=$(( $1 + $2 ))
echo "$resultado"
}
# Uso
suma=$(calcular 5 3)
echo "Suma: $suma"
Cron - Programación de Tareas
¿Qué es Cron?
Cron es un demonio que ejecuta tareas en momentos programados.
Sintaxis de Cron
Formato
┌───────────── minuto (0 - 59)
│ ┌───────────── hora (0 - 23)
│ │ ┌───────────── día del mes (1 - 31)
│ │ │ ┌───────────── mes (1 - 12)
│ │ │ │ ┌───────────── día de la semana (0 - 7) (0 o 7 = domingo)
│ │ │ │ │
* * * * * comando
Ejemplos
| Programación | Descripción |
|---|---|
0 2 * * * | Todos los días a las 2:00 |
*/5 * * * * | Cada 5 minutos |
0 */2 * * * | Cada 2 horas |
0 0 * * 0 | Todos los domingos a medianoche |
0 0 1 * * | El día 1 de cada mes |
0 9-17 * * 1-5 | 9:00 a 17:00, lunes a viernes |
0 0,12 * * * | Medianoche y mediodía cada día |
*/30 * * * * | Cada 30 minutos |
Variables de Entorno
# En crontab
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
HOME=/home/user
# Luego las tareas
0 2 * * * /ruta/a/script.sh
Uso de crontab
Editar Crontab
# Editar crontab de usuario
crontab -e
# Ver crontab actual
crontab -l
# Eliminar crontab
crontab -r
# Editar crontab de un usuario (root)
sudo crontab -u user1 -e
Formato de Crontab
# Comentario
# MIN HORA DÍA MES DÍA_SEMANA COMANDO
# Ejemplo
0 2 * * * /usr/local/bin/backup.sh
*/15 * * * * /usr/local/bin/check.sh
0 0 1 * * /usr/local/bin/monthly-report.sh
Redirección
# Redirigir salida
0 2 * * * /script.sh > /var/log/script.log 2>&1
# Ignorar salida
0 2 * * * /script.sh > /dev/null 2>&1
# Enviar por correo electrónico (si MAILTO está definido)
0 2 * * * /script.sh
Directorios de Cron
/etc/cron.d/
Para tareas del sistema:
# Crear archivo en /etc/cron.d/
sudo nano /etc/cron.d/mi-tarea
# Formato (con usuario)
0 2 * * * user1 /usr/local/bin/script.sh
Directorios Especiales
/etc/cron.hourly/ # Ejecutado cada hora
/etc/cron.daily/ # Ejecutado cada día
/etc/cron.weekly/ # Ejecutado cada semana
/etc/cron.monthly/ # Ejecutado cada mes
Coloque scripts en estos directorios (ejecutables, sin extensión .sh)
Ejemplos Prácticos
Backup Diario
#!/bin/bash
# /usr/local/bin/backup-daily.sh
BACKUP_DIR="/backup"
SOURCE_DIR="/data"
DATE=$(date +%Y%m%d)
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" "$SOURCE_DIR"
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +7 -delete
Crontab:
0 2 * * * /usr/local/bin/backup-daily.sh
Limpieza de Logs
#!/bin/bash
# /usr/local/bin/cleanup-logs.sh
find /var/log -name "*.log" -mtime +30 -delete
find /var/log -name "*.gz" -mtime +90 -delete
Crontab:
0 3 * * 0 /usr/local/bin/cleanup-logs.sh
Monitoreo
#!/bin/bash
# /usr/local/bin/check-disk.sh
THRESHOLD=80
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Alerta: Disco al ${USAGE}%" | mail -s "Alerta Disco" admin@example.com
fi
Crontab:
*/15 * * * * /usr/local/bin/check-disk.sh
Buenas Prácticas
Scripts para Cron
#!/bin/bash
# 1. Shebang
# 2. Variables de entorno
PATH=/usr/bin:/bin
# 3. Variables del script
LOG_FILE="/var/log/mi-script.log"
# 4. Funciones
# 5. Código principal con logging
Logging
#!/bin/bash
LOG_FILE="/var/log/mi-script.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
log "Inicio"
# ... procesamiento ...
log "Fin"
Manejo de Errores
#!/bin/bash
set -euo pipefail
# O manejo manual
if ! comando; then
echo "Error" | mail -s "Error Script" admin@example.com
exit 1
fi
Resumen
En este capítulo, usted ha aprendido:
Funciones: Definición, parámetros, valores de retorno
Cron: Programación de tareas automáticas
Sintaxis: * * * * * (minuto hora día mes día_semana)
crontab: Edición, visualización, eliminación
Directorios: /etc/cron.d/, cron.hourly, etc.
Práctica: Scripts con logging, manejo de errores
Próximos Pasos
Módulo 7: Red y Configuración
Módulo 8: Servicios y Demonio (con crons avanzados)
Capítulo creado el: Diciembre 2024