Saltar al contenido principal

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ónDescripción
0 2 * * *Todos los días a las 2:00
*/5 * * * *Cada 5 minutos
0 */2 * * *Cada 2 horas
0 0 * * 0Todos los domingos a medianoche
0 0 1 * *El día 1 de cada mes
0 9-17 * * 1-59: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