Skip to content

Systemd

This content is not available in your language yet.

5.2 Deep Dive en systemd: Gestión de Servicios y Arranque Moderno

Sección titulada «5.2 Deep Dive en systemd: Gestión de Servicios y Arranque Moderno»

En sistemas Linux modernos, systemd es el núcleo que orquesta el arranque del sistema, la gestión de servicios, el control de recursos y la supervisión de procesos. Sustituyendo al antiguo sistema SysVinit, systemd introduce un modelo declarativo, paralelo y altamente eficiente que permite a los Sysadmins gestionar infraestructuras complejas con precisión y consistencia.

Comprender systemd no es opcional en entornos profesionales: es esencial para diagnosticar fallos de arranque, gestionar servicios críticos, automatizar despliegues y aplicar políticas de control avanzadas.


Al finalizar este capítulo serás capaz de:

  • Entender la arquitectura interna de systemd.
  • Gestionar servicios con systemctl.
  • Interpretar unidades (units) y sus tipos.
  • Analizar logs con journalctl.
  • Crear y modificar servicios personalizados.
  • Diagnosticar problemas de arranque y dependencias.

-systemd* es un sistema de init y gestor de servicios que:

  • Es el proceso PID 1.
  • Inicializa el sistema durante el arranque.
  • Gestiona servicios (daemon), sockets, dispositivos y mounts.
  • Permite ejecución paralela para reducir el tiempo de boot.

Las unidades son la base de systemd. Cada recurso se define como una unit file.

Principales tipos:

  • .service → servicios (nginx, sshd)
  • .socket → sockets IPC o network
  • .target → agrupaciones lógicas (similar a runlevels)
  • .mount → puntos de montaje
  • .timer → tareas programadas (sustituto de cron en algunos casos)

Ejemplo de ruta estándar:

  • /usr/lib/systemd/system/ → unidades del sistema
  • /etc/systemd/system/ → overrides del administrador

Systemd reemplaza los runlevels clásicos:

Runlevel systemd target
0 poweroff.target
3 multi-user.target
5 graphical.target

Consultar target actual:

Ventana de terminal
systemctl get-default

Estados típicos:

  • active (running)
  • inactive
  • failed
  • activating

Ver estado:

Ventana de terminal
systemctl status nginx

systemd permite definir relaciones:

  • Requires= → dependencia fuerte
  • After= → orden de arranque
  • Wants= → dependencia débil

Ejemplo conceptual:

[Unit]
Requires=network.target
After=network.target

Tienes una aplicación propia (/opt/app/app.sh) que debe ejecutarse como servicio:

  • Debe arrancar automáticamente.
  • Debe reiniciarse si falla.
  • Debe registrar logs correctamente.

Ventana de terminal
sudo nano /etc/systemd/system/app.service

Contenido:

[Unit]
Description=Aplicación personalizada
After=network.target
[Service]
Type=simple
ExecStart=/opt/app/app.sh
Restart=always
User=www-data
[Install]
WantedBy=multi-user.target

  • Description → descripción del servicio.
  • After=network.target → espera red disponible.
  • Type=simple → proceso principal.
  • ExecStart → comando a ejecutar.
  • Restart=always → autoreinicio.
  • User → usuario de ejecución.
  • WantedBy → target donde se habilita.

Ventana de terminal
sudo systemctl daemon-reexec
sudo systemctl daemon-reload

Ventana de terminal
sudo systemctl start app

Ventana de terminal
sudo systemctl enable app

Ventana de terminal
systemctl status app
● app.service - Aplicación personalizada
Loaded: loaded (/etc/systemd/system/app.service)
Active: active (running)

Ventana de terminal
journalctl -u app -f

Ventana de terminal
systemctl status app

Busca:

  • errores de permisos
  • rutas incorrectas
  • scripts sin shebang (#!/bin/bash)

-Causa:* no recargaste daemon.

Ventana de terminal
sudo systemctl daemon-reload

Ventana de terminal
journalctl -xe

Revisa:

  • errores de dependencias
  • variables de entorno faltantes

Si el servicio usa User=:

Ventana de terminal
chmod +x /opt/app/app.sh

Si usas:

Restart=always

Puede generar loops.

Solución alternativa:

Restart=on-failure
RestartSec=5

1. Usa override en vez de editar unidades nativas

Sección titulada «1. Usa override en vez de editar unidades nativas»
Ventana de terminal
systemctl edit nginx

Esto crea:

/etc/systemd/system/nginx.service.d/override.conf

Ventana de terminal
journalctl -u nginx --since "1 hour ago"

Ejemplo:

[Service]
MemoryLimit=500M
CPUQuota=50%

4. Usa timers en lugar de cron cuando sea posible

Sección titulada «4. Usa timers en lugar de cron cuando sea posible»
Ventana de terminal
systemctl list-timers

Ventajas:

  • mejor integración
  • logs automáticos
  • dependencias

Ventana de terminal
systemd-analyze blame

Muestra servicios lentos.

Ventana de terminal
systemd-analyze critical-chain

Cadena crítica de arranque.


  • No ejecutar como root si no es necesario.
  • Usar:
NoNewPrivileges=true
PrivateTmp=true

Ventana de terminal
systemd-analyze verify /etc/systemd/system/app.service

Ahora dominas systemd como un Sysadmin profesional: sabes cómo crear, gestionar y diagnosticar servicios, interpretar logs y controlar el arranque del sistema.

Este conocimiento es esencial para gestionar infraestructuras modernas y garantizar alta disponibilidad.

El siguiente paso natural es automatizar tareas recurrentes:

5.3 Tareas Programadas (Cron y systemd timers) donde aprenderás a programar ejecuciones periódicas de forma robusta y controlada.