Saltar al contenido

Práctica 6 — Software y Tareas Automáticas


Ejercicio 6.1 — Gestión de paquetes con apt

Sección titulada “Ejercicio 6.1 — Gestión de paquetes con apt"

apt es el gestor de paquetes de Ubuntu/Debian. Cualquier software del sistema operativo —desde servidores web hasta herramientas de terminal— se instala, actualiza y elimina con apt.

Tarea 1 — Buscar, instalar y eliminar paquetes

Sección titulada “Tarea 1 — Buscar, instalar y eliminar paquetes"
ventana terminal
# Actualiza la lista de paquetes disponibles (no instala nada)
sudo apt update
# Busca información sobre un paquete antes de instalarlo
apt show htop
# Instala htop (monitor de recursos mejorado)
sudo apt install -y htop
# Pruébalo
htop
# Pulsa Q para salir
ventana terminal
# Instala varias herramientas de una vez
sudo apt install -y tree curl wget
# Prueba tree (muestra árbol de directorios)
tree /etc/apt/
# Elimina curl pero conserva su configuración
sudo apt remove curl
# Elimina curl y su configuración (purge)
sudo apt purge curl
# Elimina paquetes huérfanos (instalados como dependencias y ya no necesarios)
sudo apt autoremove -y

Tarea 2 — Instalar un paquete .deb manualmente

Sección titulada “Tarea 2 — Instalar un paquete .deb manualmente"

A veces un paquete no está en los repositorios y debes descargarlo como .deb:

ventana terminal
# Descarga el paquete .deb de bat (un cat mejorado con sintaxis coloreada)
wget "https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb" \
-O /tmp/bat.deb
# Instálalo con dpkg
sudo dpkg -i /tmp/bat.deb
# Pruébalo
bat /etc/hosts

Si dpkg falla por dependencias: sudo apt install -f -y y vuelve a intentarlo.


Ejercicio 6.2 — Script de informe del sistema

Sección titulada “Ejercicio 6.2 — Script de informe del sistema"

Los sysadmins programan informes automáticos para detectar problemas antes de que los usuarios los reporten. Crearás un script que recopila el estado del servidor.

ventana terminal
# Crea el directorio donde iran los informes
mkdir -p ~/informes

Primero entiende cada pieza antes de montarlas juntas:

ventana terminal
# Prueba en la terminal cada uno de estos comandos:
# 1. Fecha y hora actual
date '+%Y-%m-%d %H:%M:%S'
# 2. Hostname del servidor
hostname
# 3. Uso de disco del raíz
df -h / | tail -1
# 4. Memoria disponible
free -h | grep "Mem:"
# 5. Carga del sistema (últimos 1, 5 y 15 minutos)
uptime | awk -F'load average:' '{print $2}'
# 6. Servicios caídos (si no hay ninguno, no muestra nada)
systemctl list-units --failed --no-legend 2>/dev/null | head -5

Ahora crea el script:

ventana terminal
sudo nano /usr/local/bin/informe_sistema.sh

Escribe:

#!/bin/bash
# informe_sistema.sh — Informe diario del estado del servidor
LOGFILE="/var/log/informes/informe_$(date '+%Y-%m-%d').log"
SEPARADOR="========================================"
# Crea el directorio si no existe
mkdir -p /var/log/informes
{
echo "$SEPARADOR"
echo "INFORME DEL SERVIDOR — $(date '+%Y-%m-%d %H:%M:%S')"
echo "$SEPARADOR"
echo ""
echo "## Servidor"
echo "Hostname: $(hostname)"
echo "Kernel: $(uname -r)"
echo ""
echo "## Disco"
df -h | grep -v tmpfs
echo ""
echo "## Memoria"
free -h
echo ""
echo "## Carga del sistema"
uptime
echo ""
echo "## Servicios caídos"
FALLIDOS=$(systemctl list-units --failed --no-legend 2>/dev/null)
if [ -z "$FALLIDOS" ]; then
echo "Todos los servicios funcionan correctamente."
else
echo "$FALLIDOS"
fi
echo ""
echo "## Últimos errores del sistema"
journalctl -p err -n 5 --no-pager 2>/dev/null || echo "(sin errores recientes)"
echo ""
echo "$SEPARADOR"
echo "Fin del informe"
} >> "$LOGFILE"
echo "Informe guardado en: $LOGFILE"

Dale permisos de ejecución y pruébalo:

ventana terminal
sudo chmod +x /usr/local/bin/informe_sistema.sh
# Prueba manual
sudo /usr/local/bin/informe_sistema.sh
# Lee el informe generado
cat /var/log/informes/informe_$(date '+%Y-%m-%d').log

El informe debe tener todas las secciones rellenas. Si alguna está vacía, revisa el comando correspondiente.


Ejercicio 6.3 — Programar con systemd timer

Sección titulada “Ejercicio 6.3 — Programar con systemd timer"
ventana terminal
sudo nano /etc/systemd/system/informe-sistema.service
[Unit]
Description=Informe diario del estado del servidor
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/informe_sistema.sh
[Install]
WantedBy=multi-user.target
ventana terminal
sudo nano /etc/systemd/system/informe-sistema.timer
[Unit]
Description=Timer para informe diario a las 7:00
[Timer]
OnCalendar=*-*-* 07:00:00
Persistent=true
[Install]
WantedBy=timers.target
ventana terminal
sudo systemctl daemon-reload
# Habilita el timer
sudo systemctl enable informe-sistema.timer
# Arranca el timer
sudo systemctl start informe-sistema.timer
# Verifica el estado
systemctl status informe-sistema.timer
# Verifica cuándo es la próxima ejecución
systemctl list-timers | grep informe
# Fuerza una ejecución inmediata para probar
sudo systemctl start informe-sistema.service
# Verifica en los logs de systemd
journalctl -u informe-sistema.service -n 5 --no-pager
# Verifica que se generó el informe
ls -la /var/log/informes/
cat /var/log/informes/informe_$(date '+%Y-%m-%d').log

ventana terminal
echo "=== ENTREGA PRÁCTICA 6 ===" && \
echo "" && \
echo "--- Script de informe ---" && \
cat /usr/local/bin/informe_sistema.sh && \
echo "" && \
echo "--- Estado del timer ---" && \
systemctl status informe-sistema.timer && \
echo "" && \
echo "--- Próxima ejecución ---" && \
systemctl list-timers | grep informe && \
echo "" && \
echo "--- Último informe generado ---" && \
ls -la /var/log/informes/ && \
echo "" && \
sudo tail -30 /var/log/informes/informe_$(date '+%Y-%m-%d').log