Systemd explicado: gestiona servicios en Linux como un pro
Si administras servidores Linux y necesitas gestionar servicios con Systemd, estás en el lugar correcto. Systemd es el gestor de servicios estándar en prácticamente todas las distribuciones modernas — Ubuntu, Debian, CentOS, RHEL — y una vez lo entiendes no quieres volver atrás al viejo service nginx start.
¿Qué es Systemd y por qué gestionar servicios Linux con él?
Systemd es el sistema de inicio (PID 1) de Linux. Se encarga de arrancar el sistema, gestionar los servicios (daemons), montar sistemas de archivos y centralizar los logs. Sustituyó a SysVinit en la mayoría de distros a partir de 2015. La herramienta principal para interactuar con Systemd es systemctl. Puedes consultar la documentación oficial de Systemd para más detalle.
Comandos esenciales para gestionar servicios con Systemd
Iniciar, detener y reiniciar servicios Linux
# Iniciar, detener y reiniciar
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# Recargar configuración sin reiniciar
sudo systemctl reload nginx
# Reiniciar solo si ya estaba corriendo
sudo systemctl reload-or-restart nginx
Ver el estado de un servicio en Systemd
# Estado detallado con logs recientes
sudo systemctl status nginx
# Comprobar si está activo (útil en scripts)
systemctl is-active nginx
# Comprobar si arranca con el sistema
systemctl is-enabled nginx
Aprende a leer bien el output de systemctl status — muestra PID, tiempo de arranque, memoria, últimas líneas de log y estado. Es tu mejor aliado cuando algo falla. Si el servicio falla al arrancar, te recomiendo ver el post de SSH sin contraseña para entender cómo conectarte al servidor y depurarlo.
Habilitar servicios Linux en el arranque con Systemd
# Habilitar y arrancar a la vez (lo uso siempre)
sudo systemctl enable --now nginx
# Deshabilitar y detener a la vez
sudo systemctl disable --now nginx
Listar y filtrar servicios
# Todos los servicios
systemctl list-units --type=service
# Solo los que están fallando
systemctl list-units --type=service --state=failed
# Los habilitados para el arranque
systemctl list-unit-files --type=service --state=enabled
Crear un servicio personalizado en Systemd
Esta es la parte más potente de Systemd para gestionar servicios Linux propios. Puedes convertir cualquier script o aplicación en un servicio con arranque automático y reinicio ante fallos. Los unit files van en /etc/systemd/system/. Ejemplo para una app Node.js:
# /etc/systemd/system/mi-app.service
[Unit]
Description=Mi aplicación Node.js
After=network.target
[Service]
Type=simple
User=victor
WorkingDirectory=/home/victor/mi-app
ExecStart=/usr/bin/node /home/victor/mi-app/index.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
# Recargar Systemd y arrancar el servicio
sudo systemctl daemon-reload
sudo systemctl enable --now mi-app
sudo systemctl status mi-app
Opciones más importantes del unit file de Systemd
| Opción | Valores | Qué hace |
|---|---|---|
| Restart | no, on-failure, always | Cuándo reiniciar el servicio |
| RestartSec | 5, 10, 30 | Segundos antes de reiniciar |
| After | network.target, postgresql.service | Arrancar después de |
| User | nombre usuario | Usuario que ejecuta el servicio |
| EnvironmentFile | /etc/mi-app.env | Variables desde un archivo |
Ver logs de servicios Systemd con journalctl
Systemd incluye su propio sistema de logs llamado journald. Es fundamental para depurar servicios Linux que no arrancan. La herramienta es journalctl:
# Seguir logs en tiempo real
journalctl -u nginx -f
# Últimas 50 líneas
journalctl -u nginx -n 50
# Logs de las últimas 2 horas
journalctl -u nginx --since "2 hours ago"
# Solo errores
journalctl -u nginx -p err
Si tu servicio falla con errores de permisos, revisa también el post sobre permisos en Linux con chmod y chown — suele ser la causa más habitual.
Análisis del arranque del sistema con Systemd
# Ver cuánto tarda en arrancar el sistema
systemd-analyze
# Ver qué servicios tardan más en arrancar
systemd-analyze blame
# Ver el árbol de dependencias de un servicio
systemctl list-dependencies nginx
Referencia rápida: gestionar servicios Linux con Systemd
| Comando Systemd | Qué hace |
|---|---|
systemctl start/stop/restart servicio | Gestiona el estado del servicio |
systemctl status servicio | Estado detallado con logs recientes |
systemctl enable --now servicio | Habilita y arranca el servicio |
systemctl disable --now servicio | Deshabilita y detiene el servicio |
systemctl daemon-reload | Recarga los unit files |
journalctl -u servicio -f | Sigue los logs en tiempo real |
systemd-analyze blame | Qué servicios tardan más en arrancar |
Conclusión
Gestionar servicios Linux con Systemd parece complejo al principio pero una vez entiendes el patrón — unit files, systemctl, journalctl — se vuelve muy intuitivo. Crear servicios personalizados para tus aplicaciones es una de las mejores inversiones de tiempo en cualquier servidor de producción.
En el próximo post veremos el troubleshooting de Systemd — qué hacer cuando un servicio no arranca y cómo interpretar los errores. ¿Algún servicio que te haya dado problemas? Déjalo en los comentarios.
