image systemd and systemctl
linux

Systemd y systemctl: la guía práctica para entender y controlar servicios en Linux

Si usas Ubuntu, Debian, Fedora, CentOS Stream o Arch, lo más probable es que tu sistema arranque y gestione servicios con systemd. Y la herramienta que tú usas para controlarlo en el día a día es systemctl.

La idea de este artículo es que entiendas qué hace systemd, qué es un “servicio”, y cómo administrarlo sin volverte loco.


¿Qué es systemd?

systemd es el sistema de inicio (init system) y administrador de servicios más común en Linux moderno. Sus tareas principales:

  • Arrancar el sistema y sus componentes en orden.
  • Gestionar servicios (daemons) como Nginx, MySQL, SSH, Docker, etc.
  • Administrar logs (con journald).
  • Manejar targets (niveles de arranque), timers (tareas programadas), sockets, montajes, etc.

En pocas palabras: systemd es el “manager” del sistema, y los “programas” que mantiene vivos suelen ser servicios.


¿Qué es systemctl?

systemctl es el comando para hablar con systemd. Con systemctl haces cosas como:

  • iniciar / detener / reiniciar un servicio
  • habilitar un servicio para que arranque al iniciar el sistema
  • ver estado y errores
  • listar unidades (units) activas o instaladas

Piensa en:

  • systemd = el motor
  • systemctl = el volante y el tablero

Comandos esenciales de systemctl

Iniciar, detener y reiniciar un servicio

# Iniciar un servicio
sudo systemctl start application.service

# Detener un servicio
sudo systemctl stop application.service

# Reiniciar un servicio
sudo systemctl restart application.service

Estado de un servicio

# Ver el estado de un servicio
sudo systemctl status application.service

# Options 
# is-active Return active | inactive
sudo systemctl is-active application.service

# is-enabled Return enabled | disabled or failed
sudo systemctl is-enabled application.service

Recargar un servicio. Esto es útil cuando cambias la configuración de un servicio.

sudo systemctl reload app.service
# sudo systemctl reload nginx
# sudo systemctl reload ssh
# sudo systemctl reload mariadb

Habilitar un servicio para que arranque con el sistema

sudo systemctl enable nginx
sudo systemctl disable nginx

listar servicios y entender que esta corriendo

systemctl list-units --type=service

Ver los que fallaron

systemctl --failed

Estado de servicios

# Visualizar todos los servicios administrados por systemd
systemctl

# Options 
# list-units Lista solo los servicios activos

# Arguments
# --all Muestra todos los tipos de servicios
# --state Permite indicarle una busqueda --state=inactive
# --type Permite indicar una busqueda de un tipo en especifico --type=service

# Example Listar solo servicios activos y de tipo servicio
sudo systemctl --state=active --type=service

# Output
# UNIT                        LOAD        ACTIVE         SUB         DESCRIPTION
# application.service        loaded        active        running           application services        
  • UNIT: El nombre de la unidad de systemd
  • LOAD: Si la configuración de la unidad ha sido analizada por systemd. La configuración de las unidades cargadas se mantiene en la memoria.
  • ACTIVE: Un estado resumido que indica si la unidad está activa. Esta es normalmente una forma bastante básica de saber si la unidad se ha iniciado correctamente o no.
    • Enabled: El servicio está habilitado, se está usando o está disponible para su uso.
    • Disabled: El servicio está deshabilitado. Si lo necesitamos lo podemos habilitar sin mayor problema.
    • Masked: El servicio está completamente deshabilitado y no se puede iniciar de ningún modo sin previamente desenmascararlo.
    • Static: Servicios que únicamente se usarán en el caso que otro servicio o unidad lo precise. Estos servicios pueden estar activos o inactivos, pero siempre están disponibles para cuando se necesite usarlos. Estos servicios no se pueden activar ni desactivar, pero se pueden enmascarar.
    • Generated: Servicio que ha sido iniciado a través de un initscript SysV o LSB con systemd generator.
  • SUB: Este es un estado de nivel inferior que indica información más detallada sobre la unidad. Esto a menudo varía por tipo de unidad, estado y el método real en el que se ejecuta la unidad.
  • DESCRIPTION: Una descripción textual breve de qué es y hace la unidad.

Por ultimo tenemos el comando man que nos ayuda a profundizar con systemctl.

man systemctl

journald: el compañero de systemctl

systemd guarda logs con journalctl.

Ver logs de un servicio

journalctl -u nginx

Ver logs recientes y seguirlos en vivo (tail -f)

journalctl -u nginx -f

Ver solo los de hoy

journalctl -u nginx --since today

Último arranque (muy útil para debugging post-reinicio)

journalctl -u nginx -b

Cómo crear un servicio systemd (mini ejemplo real)

Supongamos que tienes un script o app (Node, PHP worker, Python) que quieres dejar corriendo como servicio.

Archivo:

sudo nano /etc/systemd/system/mi-app.service

Contenido típico:

[Unit]
Description=Mi App Worker
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mi-app
ExecStart=/usr/bin/node /var/www/mi-app/index.js
Restart=always
RestartSec=3
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

Luego:

sudo systemctl daemon-reload
sudo systemctl enable --now mi-app
systemctl status mi-app

Puntos clave:

  • After=network.target asegura que la red esté arriba.
  • Restart=always lo revive si se cae.
  • User= evita correr todo como root (buena práctica).

Resumen mental para no confundirte

systemd administra el sistema (arranque, servicios, logs, timers).

systemctl controla unidades (especialmente servicios).

Flujo típico:

  1. systemctl status X
  2. journalctl -u X -f
  3. sudo systemctl restart X
  4. sudo systemctl enable --now X