Saltar al contenido

Práctica 4 — Arranque y Servicios


Ejercicio 4.1 — Crear una unidad systemd y un timer

Sección titulada “Ejercicio 4.1 — Crear una unidad systemd y un timer"

systemd es el sistema de init de Linux: gestiona todos los servicios del sistema. Cualquier programa puede convertirse en un servicio systemd creando un archivo de unidad (.service). Los timers son la alternativa moderna a cron, integrada con el sistema de logging.

Setup — preparar el script que vamos a automatizar

Sección titulada “Setup — preparar el script que vamos a automatizar"
ventana terminal
# Crea el script que el servicio ejecutará
sudo nano /usr/local/bin/monitor_disco.sh

Escribe exactamente este contenido:

#!/bin/bash
# monitor_disco.sh — registra el uso del disco en un log
LOGFILE="/var/log/monitor_disco.log"
FECHA=$(date '+%Y-%m-%d %H:%M:%S')
USO=$(df -h / | tail -1 | awk '{print $5}')
echo "[$FECHA] Uso del disco raíz: $USO" >> "$LOGFILE"

Guarda y dale permisos de ejecución:

ventana terminal
sudo chmod +x /usr/local/bin/monitor_disco.sh
# Prueba manual que funciona
sudo /usr/local/bin/monitor_disco.sh
cat /var/log/monitor_disco.log
# Debe aparecer una línea con la fecha y el porcentaje de uso del disco

Las unidades systemd viven en /etc/systemd/system/. Crea el archivo:

ventana terminal
sudo nano /etc/systemd/system/monitor-disco.service

Escribe esto:

[Unit]
Description=Monitor de uso del disco
Documentation=man:df(1)
[Service]
Type=oneshot
ExecStart=/usr/local/bin/monitor_disco.sh
[Install]
WantedBy=multi-user.target

Prueba que el servicio funciona:

ventana terminal
# Recarga la configuración de systemd (siempre después de crear/editar una unidad)
sudo systemctl daemon-reload
# Ejecuta el servicio manualmente
sudo systemctl start monitor-disco.service
# Verifica que se ejecutó
systemctl status monitor-disco.service
cat /var/log/monitor_disco.log
# Debe haber una línea nueva con la fecha actual

El timer define cuándo ejecutar el servicio. Crea:

ventana terminal
sudo nano /etc/systemd/system/monitor-disco.timer

Escribe:

[Unit]
Description=Timer para el monitor de disco (cada 5 minutos)
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target

Activa y arranca el timer:

ventana terminal
sudo systemctl daemon-reload
# Habilita el timer para que arranque automáticamente con el sistema
sudo systemctl enable monitor-disco.timer
# Arranca el timer ahora mismo
sudo systemctl start monitor-disco.timer
# Verifica el estado
systemctl status monitor-disco.timer

Verifica que aparece en la lista de timers:

ventana terminal
systemctl list-timers | grep monitor

Deberías ver la próxima ejecución programada.

Tarea 3 — Forzar una ejecución y verificar el log

Sección titulada “Tarea 3 — Forzar una ejecución y verificar el log"
ventana terminal
# Fuerza ejecución inmediata del servicio (no del timer)
sudo systemctl start monitor-disco.service
# Espera 5 minutos y comprueba que el timer lo ejecuta automáticamente
# Mientras esperas, puedes ver el log en tiempo real:
sudo tail -f /var/log/monitor_disco.log
# (Pulsa Ctrl+C para salir)
# También puedes ver el historial de ejecuciones en journalctl
journalctl -u monitor-disco.service -n 10 --no-pager

Ejercicio 4.2 — Reparar una unidad systemd con errores

Sección titulada “Ejercicio 4.2 — Reparar una unidad systemd con errores"

Alguien creó una unidad systemd con errores tipográficos. El servicio no arranca. Tu trabajo es encontrar todos los errores y corregirlos.

ventana terminal
sudo nano /etc/systemd/system/app-demo.service

Copia esto exactamente como está (con los errores):

[Unit]
Description=Aplicación de demostración
After=network.tarjet
[Service]
ExecSart=/usr/local/bin/app-demo
Restart=always
User=nobody
[Instal]
WantedBy=multi-user.target
ventana terminal
sudo systemctl daemon-reload

systemd te dará pistas, pero debes saber interpretarlas. Sigue este proceso:

Paso 1 — Intenta arrancar y observa el error:

ventana terminal
sudo systemctl start app-demo.service
systemctl status app-demo.service

¿Qué dice el error? Puede que systemd no encuentre el ejecutable o que haya errores de sintaxis.

Paso 2 — Verifica la sintaxis del archivo:

ventana terminal
systemd-analyze verify /etc/systemd/system/app-demo.service

Este comando muestra todos los problemas de sintaxis. Léelo con cuidado.

Paso 3 — Revisa los logs para más detalles:

ventana terminal
journalctl -u app-demo.service -n 20 --no-pager

Pista: hay exactamente 3 errores tipográficos en el archivo y 1 problema adicional (el binario no existe). Localiza y corrige cada uno:

  1. En [Unit]: hay una sección con un typo
  2. En [Service]: hay una directiva con un typo
  3. En [Install]: hay un error al escribir el nombre de la sección

Una vez corregidos los typos, crea el binario que falta:

ventana terminal
sudo nano /usr/local/bin/app-demo

Escribe:

#!/bin/bash
# Simula una aplicación en ejecución continua
while true; do
echo "$(date): app-demo en ejecución" >> /var/log/app-demo.log
sleep 30
done
ventana terminal
sudo chmod +x /usr/local/bin/app-demo

Paso 4 — Repara el archivo y prueba:

ventana terminal
sudo nano /etc/systemd/system/app-demo.service
# Corrige los 3 typos
sudo systemctl daemon-reload
sudo systemctl start app-demo.service
systemctl status app-demo.service
# Debe aparecer como 'active (running)'

ventana terminal
echo "=== ENTREGA PRÁCTICA 4 ===" && \
echo "" && \
echo "--- 4.1: Estado del timer ---" && \
systemctl status monitor-disco.timer && \
echo "" && \
echo "--- 4.1: Próxima ejecución ---" && \
systemctl list-timers | grep monitor && \
echo "" && \
echo "--- 4.1: Últimas entradas del log ---" && \
tail -5 /var/log/monitor_disco.log && \
echo "" && \
echo "--- 4.1: Archivo .service ---" && \
cat /etc/systemd/system/monitor-disco.service && \
echo "" && \
echo "--- 4.1: Archivo .timer ---" && \
cat /etc/systemd/system/monitor-disco.timer && \
echo "" && \
echo "--- 4.2: Estado del servicio reparado ---" && \
systemctl status app-demo.service && \
echo "" && \
echo "--- 4.2: Archivo .service corregido ---" && \
cat /etc/systemd/system/app-demo.service