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.targetasegura que la red esté arriba.Restart=alwayslo 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:
systemctl status Xjournalctl -u X -fsudo systemctl restart Xsudo systemctl enable --now X
