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"Contexto
Sección titulada “Contexto"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"# Crea el script que el servicio ejecutarásudo nano /usr/local/bin/monitor_disco.shEscribe 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:
sudo chmod +x /usr/local/bin/monitor_disco.sh
# Prueba manual que funcionasudo /usr/local/bin/monitor_disco.shcat /var/log/monitor_disco.log# Debe aparecer una línea con la fecha y el porcentaje de uso del discoTarea 1 — Crear la unidad de servicio
Sección titulada “Tarea 1 — Crear la unidad de servicio"Las unidades systemd viven en /etc/systemd/system/. Crea el archivo:
sudo nano /etc/systemd/system/monitor-disco.serviceEscribe esto:
[Unit]Description=Monitor de uso del discoDocumentation=man:df(1)
[Service]Type=oneshotExecStart=/usr/local/bin/monitor_disco.sh
[Install]WantedBy=multi-user.targetPrueba que el servicio funciona:
# Recarga la configuración de systemd (siempre después de crear/editar una unidad)sudo systemctl daemon-reload
# Ejecuta el servicio manualmentesudo systemctl start monitor-disco.service
# Verifica que se ejecutósystemctl status monitor-disco.servicecat /var/log/monitor_disco.log# Debe haber una línea nueva con la fecha actualTarea 2 — Crear el timer
Sección titulada “Tarea 2 — Crear el timer"El timer define cuándo ejecutar el servicio. Crea:
sudo nano /etc/systemd/system/monitor-disco.timerEscribe:
[Unit]Description=Timer para el monitor de disco (cada 5 minutos)
[Timer]OnCalendar=*:0/5Persistent=true
[Install]WantedBy=timers.targetActiva y arranca el timer:
sudo systemctl daemon-reload
# Habilita el timer para que arranque automáticamente con el sistemasudo systemctl enable monitor-disco.timer
# Arranca el timer ahora mismosudo systemctl start monitor-disco.timer
# Verifica el estadosystemctl status monitor-disco.timerVerifica que aparece en la lista de timers:
systemctl list-timers | grep monitorDeberí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"# 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 journalctljournalctl -u monitor-disco.service -n 10 --no-pagerEjercicio 4.2 — Reparar una unidad systemd con errores
Sección titulada “Ejercicio 4.2 — Reparar una unidad systemd con errores"Contexto
Sección titulada “Contexto"Alguien creó una unidad systemd con errores tipográficos. El servicio no arranca. Tu trabajo es encontrar todos los errores y corregirlos.
Setup — crear el servicio roto
Sección titulada “Setup — crear el servicio roto"sudo nano /etc/systemd/system/app-demo.serviceCopia esto exactamente como está (con los errores):
[Unit]Description=Aplicación de demostraciónAfter=network.tarjet
[Service]ExecSart=/usr/local/bin/app-demoRestart=alwaysUser=nobody
[Instal]WantedBy=multi-user.targetsudo systemctl daemon-reloadDiagnóstico — encuentra los errores
Sección titulada “Diagnóstico — encuentra los errores"systemd te dará pistas, pero debes saber interpretarlas. Sigue este proceso:
Paso 1 — Intenta arrancar y observa el error:
sudo systemctl start app-demo.servicesystemctl 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:
systemd-analyze verify /etc/systemd/system/app-demo.serviceEste comando muestra todos los problemas de sintaxis. Léelo con cuidado.
Paso 3 — Revisa los logs para más detalles:
journalctl -u app-demo.service -n 20 --no-pagerPista: hay exactamente 3 errores tipográficos en el archivo y 1 problema adicional (el binario no existe). Localiza y corrige cada uno:
- En
[Unit]: hay una sección con un typo - En
[Service]: hay una directiva con un typo - En
[Install]: hay un error al escribir el nombre de la sección
Una vez corregidos los typos, crea el binario que falta:
sudo nano /usr/local/bin/app-demoEscribe:
#!/bin/bash# Simula una aplicación en ejecución continuawhile true; do echo "$(date): app-demo en ejecución" >> /var/log/app-demo.log sleep 30donesudo chmod +x /usr/local/bin/app-demoPaso 4 — Repara el archivo y prueba:
sudo nano /etc/systemd/system/app-demo.service# Corrige los 3 typos
sudo systemctl daemon-reloadsudo systemctl start app-demo.servicesystemctl status app-demo.service# Debe aparecer como 'active (running)'📤 Bloque de entrega
Sección titulada “📤 Bloque de entrega"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