Gestionar servicios con systemd
Módulo 6: Servicios y registros · Tiempo de lectura: 10 minutos
Objetivo de aprendizaje: Después de esta lección, usted sabrá iniciar, detener y recargar servicios y hacer que se inicien al arrancar el sistema, leer el estado de un servicio y modificar de forma segura un ajuste de un servicio con un drop-in.
Conceptos clave: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
¿Quién mantiene todo en marcha?
En un servidor se ejecutan decenas de programas que deben estar siempre disponibles: el servidor SSH, el servidor web, una base de datos, la sincronización horaria. Estos programas se llaman servicios (services, o daemons). Alguien tiene que iniciarlos al arrancar, vigilarlos y volver a iniciarlos si se caen. En Debian, Ubuntu, AlmaLinux y Rocky Linux, de eso se encarga systemd. Es el primer programa que inicia el kernel (proceso 1) y, a continuación, inicia todo lo demás.
systemd trabaja con units (unidades): descripciones de algo que debe gestionar. Los tipos más importantes:
| Tipo | Extensión | Ejemplo |
|---|---|---|
| Servicio | .service | nginx.service, ssh.service |
| Temporizador (tarea programada) | .timer | apt-daily.timer (lección 4.2, lección 6.3) |
| Socket | .socket | ssh.socket en Ubuntu 24.04 y posteriores |
| Objetivo (grupo de units) | .target | multi-user.target |
Usted se comunica con systemd mediante el comando systemctl. Puede omitir la extensión .service: systemctl status nginx equivale a systemctl status nginx.service.
Leer el estado
El comando que más utilizará:
anna@web1:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-11-09 08:12:44 CET; 3h 2min ago
Docs: man:nginx(8)
Process: 902 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 905 (nginx)
Tasks: 3 (limit: 2275)
Memory: 4.1M (peak: 6.3M)
CPU: 213ms
CGroup: /system.slice/nginx.service
├─905 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─906 "nginx: worker process"
nov 09 08:12:44 web1 systemd[1]: Starting nginx.service - A high performance web server...
nov 09 08:12:44 web1 systemd[1]: Started nginx.service - A high performance web server...Léalo de arriba abajo:
- El punto delante del nombre es verde si el servicio está en marcha, blanco si está detenido y rojo si ha fallado.
- Loaded indica dónde está el archivo de la unit y si el servicio se inicia al arrancar (
enabled) o no (disabled). - Active indica si está en marcha ahora (
active (running)), si está detenido (inactive (dead)) o si ha fallado (failed), y desde cuándo. - Main PID y CGroup muestran qué procesos pertenecen al servicio.
- Abajo aparecen las últimas líneas del registro del servicio. A menudo ya se ve ahí por qué algo falla; puede leer más con
journalctl(lección 6.2).
Iniciar, detener, reiniciar y recargar
anna@web1:~$ sudo systemctl start nginx # iniciar ahora
anna@web1:~$ sudo systemctl stop nginx # detener ahora
anna@web1:~$ sudo systemctl restart nginx # detener y volver a iniciar
anna@web1:~$ sudo systemctl reload nginx # volver a leer la configuración sin detenerLa diferencia entre restart y reload es importante en la práctica. Con un restart, el servicio se detiene un momento: se cortan las conexiones en curso y, si la nueva configuración contiene un error, ya no arranca y su sitio web queda caído. Con un reload, el servicio vuelve a leer su configuración sin dejar de funcionar; si la configuración tiene un error, nginx mantiene la anterior. Por eso, después de cambiar la configuración de nginx, Caddy, SSH o fail2ban, utilice reload y pruebe antes la configuración (nginx -t, sshd -t, fail2ban-client -t). No todos los servicios admiten reload; systemctl reload-or-restart elige por sí mismo.
Al arrancar: enable y disable
Iniciar un servicio y hacer que "se inicie al arrancar" son dos cosas distintas:
anna@web1:~$ sudo systemctl enable nginx # a partir de ahora se inicia al arrancar
anna@web1:~$ sudo systemctl disable nginx # ya no se inicia al arrancar
anna@web1:~$ sudo systemctl enable --now nginx # ambas cosas: iniciar ahora y al arrancar
anna@web1:~$ systemctl is-enabled nginx
enabledUn error clásico: usted inicia un servicio con start, todo funciona y, tras el siguiente reinicio (por ejemplo, por una actualización del kernel, lección 4.2), ha desaparecido. Por eso, para un servicio nuevo, utilice enable --now.
Si quiere asegurarse de que un servicio no se inicie nunca, ni siquiera cuando otro servicio lo solicite, existe mask: sudo systemctl mask <dienst>. Para deshacerlo, use unmask.
¿Qué está fallando?
Un solo comando muestra todas las units que han fallado:
anna@web1:~$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● php8.4-fpm.service loaded failed failed The PHP 8.4 FastCGI Process Manager
1 loaded units listed.Conviértalo en un hábito, por ejemplo después de cada reinicio y de cada actualización (lección 4.3): la lista debería estar vacía. Una vez resuelto el problema, elimine el aviso con sudo systemctl reset-failed.
Una vista general de todos los servicios en marcha:
anna@web1:~$ systemctl list-units --type=service --state=runningSi hay algo en marcha que no conoce o no utiliza, averigüe qué es. Todo servicio que no sea necesario es superficie de ataque innecesaria (lección 5.1 y 10.1).
Archivos de unit y drop-ins
Un archivo de unit es un archivo de texto. La versión del paquete está en /usr/lib/systemd/system/ (en sistemas más antiguos, /lib/systemd/system/). Ese archivo no lo modifique nunca: una actualización del paquete lo sobrescribe. Sus propios cambios van en un drop-in: un pequeño archivo que contiene solo las líneas que desea cambiar. Lo más sencillo es hacerlo con:
anna@web1:~$ sudo systemctl edit nginxSe abre un editor con un espacio vacío entre dos líneas de comentario. Lo que escriba ahí se guarda en /etc/systemd/system/nginx.service.d/override.conf. Por ejemplo: reiniciar nginx automáticamente si se detiene de forma inesperada.
[Service]
Restart=on-failure
RestartSec=5sAl guardar, systemctl edit recarga automáticamente la configuración de systemd. Si edita un archivo de unit de otra manera, ejecute usted mismo:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload hace que systemd vuelva a leer los archivos de unit; después, el propio servicio debe reiniciarse para aplicar el cambio. El resultado completo (original más drop-ins) se ve con systemctl cat nginx.
Restart=on-failure es una buena costumbre para los servicios importantes. Pero no oculte con ello un error real: un servicio que se bloquea cada cinco segundos y vuelve a arrancar debe investigarse en el registro. Tras varios fallos rápidos seguidos, systemd deja de reiniciarlo (el límite predeterminado es de cinco inicios en diez segundos) y marca el servicio como failed.
En AlmaLinux y Rocky Linux
systemd y systemctl funcionan exactamente igual. Solo cambian a veces los nombres de los servicios: el servicio SSH se llama sshd, el servidor web de la distribución se llama httpd (Apache) o nginx, y el firewall firewalld.
En la práctica
El panel de VPS de su proveedor (en WebOké y en otros) permite apagar, reiniciar o realizar un "apagado forzado" de todo el servidor. Esto último equivale a desenchufarlo: los servicios no tienen ocasión de detenerse correctamente y una base de datos puede dañarse. Dentro del servidor, utilice sudo systemctl reboot o sudo shutdown -h now, y en el panel, los botones normales de apagar o reiniciar.
Resumen
- systemd inicia y vigila todos los servicios; usted lo maneja con
systemctl. systemctl statusmuestra si un servicio está en marcha, si se inicia al arrancar y las últimas líneas del registro.start/stop/restartactúan sobre el momento actual,enable/disablesobre el arranque; utiliceenable --nowpara un servicio nuevo.- Tras un cambio de configuración: primero probar, después
reload;systemctl --faileddebería estar vacío. - No modifique nunca el archivo de unit de un paquete; utilice un drop-in con
systemctl edit.
Cuestionario
Ejercicio
Ejercicio O6.1: Inventario de sus servicios. Haga en su servidor una lista de todos los servicios en marcha (systemctl list-units --type=service --state=running) y compruebe si systemctl --failed está vacío. Indique para cada servicio qué hace y si lo necesita. Elija un servicio que no conociera y averigüe qué es (systemctl status, man). Después, para un servicio importante, configure Restart=on-failure en un drop-in y compruebe con systemctl cat que está aplicado.
Ejercicio O6.1: Inventario de sus servicios
Este ejercicio lo hace usted mismo; nadie lo revisa. Marque lo que haya hecho y señale el ejercicio como realizado.
Un drop-in se encuentra en /etc/systemd/system/<naam>.service.d/override.conf, no en /usr/lib/systemd. Con reload el servicio sigue funcionando y, por ejemplo, nginx conserva la configuración anterior si hay un error; compruébelo antes con nginx -t o sshd -t. Servicios innecesarios: disable --now o eliminar el paquete.
Sus marcas y notas se quedan solo en este navegador; no las enviamos a ningún sitio. Si ha iniciado sesión, en Mis cursos solo guardamos que ha realizado el ejercicio.
Para saber más
- Manual de
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Manual de
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Manual de
systemd.unit(5)(drop-ins): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
