Saltar al contenido principal
Volver al blog
· 6 min de lectura

systemctl: gestión de servicios con Systemd en Linux

Guía de referencia de systemctl: acciones principales, banderas, gestión avanzada del sistema y cómo crear servicios personalizados con Systemd en Linux.

linux terminal sre

Systemd es el sistema de inicio y gestor de servicios (demonio init) más utilizado en las distribuciones Linux modernas como Ubuntu, Debian, CentOS 7+, Fedora, entre otras. El comando systemctl es la herramienta principal para interactuar con Systemd y controlar el estado de todo el sistema: servicios, dispositivos montados, sockets y el estado de la propia máquina. Permite iniciar, detener, habilitar o comprobar el estado de cualquier servicio.

Sintaxis

systemctl [ACCIÓN] [NOMBRE_DE_LA_UNIDAD]

Una unidad (unit) es el archivo de configuración que describe un servicio, un dispositivo o un punto de montaje (por ejemplo: apache2.service, sshd.service). Si no se especifica el sufijo .service, systemctl lo asume automáticamente.

Acciones principales

AcciónDescripciónEjemplo
statusMuestra el estado actual del servicio (activo, inactivo, fallido, etc.) y últimos logssystemctl status sshd
startInicia un serviciosudo systemctl start apache2
stopDetiene un servicio en ejecuciónsudo systemctl stop nginx
restartDetiene y vuelve a iniciar un serviciosudo systemctl restart php-fpm
reloadRecarga la configuración sin interrumpir el servicio (si el servicio lo soporta)sudo systemctl reload nginx
enableHabilita el servicio para que inicie automáticamente al arrancar el sistemasudo systemctl enable firewalld
disableDeshabilita el servicio para que no inicie automáticamente al arrancarsudo systemctl disable httpd
is-activeComprueba si la unidad está activa (devuelve código de salida 0 si lo está)systemctl is-active sshd

Banderas comunes

BanderaDescripciónEjemplo
--userControla la instancia de Systemd a nivel de usuario (servicios iniciados por ti), no del sistemasystemctl --user status
--failedMuestra solo los servicios que han fallado en su ejecuciónsystemctl --failed

Gestión avanzada del sistema

Más allá de controlar servicios individuales, systemctl permite administrar el estado general de la máquina y consultar información detallada sobre las unidades cargadas.

TareaComando
Listar todos los servicios cargados en memoriasystemctl list-units --type=service
Ver la jerarquía de dependencias de un serviciosystemctl list-dependencies sshd
Apagar el sistemasudo systemctl poweroff
Reiniciar el sistemasudo systemctl reboot
Cambiar al modo de un solo usuario (rescate)sudo systemctl isolate rescue.target
Recargar Systemd tras modificar un archivo de unidadsudo systemctl daemon-reload

Importante: ejecuta sudo systemctl daemon-reload cada vez que crees o modifiques un archivo de unidad (.service). Sin este paso, Systemd no reconocerá los cambios.

Crear servicios personalizados

Los archivos de unidad de servicio le indican a Systemd cómo debe manejar un programa: cómo iniciarlo, dónde encontrarlo, qué usuario debe usarlo y qué hacer si falla. A continuación se muestra el proceso completo usando una aplicación Next.js como ejemplo.

Crear el archivo de unidad (.service)

Crea un archivo con la extensión .service en el directorio de configuración de Systemd:

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

Contenido del archivo

Añade el siguiente contenido, reemplazando los valores entre corchetes ([...]) con los datos de tu aplicación:

[Unit]
Description=Servicio de aplicacion Next.js para [nombre_de_tu_app]
After=network.target

[Service]
User=[usuario_linux]
WorkingDirectory=/home/[usuario_linux]/[ruta_a_tu_app]
ExecStart=/usr/bin/npm start
Restart=always
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
SecciónDirectivaDescripción
[Unit]DescriptionNombre descriptivo del servicio
[Unit]AfterAsegura que el servicio inicie después de que la red esté activa
[Service]UserUsuario bajo el que se ejecutará el servicio (ej. www-data o tu usuario)
[Service]WorkingDirectoryDirectorio raíz de la aplicación
[Service]ExecStartComando para iniciar el servicio (usa la ruta completa al binario)
[Service]RestartPolítica de reinicio (always reinicia el servicio si se detiene inesperadamente)
[Service]StandardOutputRedirige la salida estándar a los logs del sistema
[Service]StandardErrorRedirige los errores a los logs del sistema
[Install]WantedByIndica que el servicio debe iniciarse en el modo multiusuario (arranque normal)

La ruta completa a npm o node (por ejemplo /usr/bin/npm) se puede encontrar ejecutando which npm o which node.

Aplicar y habilitar el servicio

Una vez guardado el archivo, ejecuta los siguientes comandos para que Systemd reconozca, cargue y active el nuevo servicio:

TareaComandoDescripción
Recargar Systemdsudo systemctl daemon-reloadObliga a Systemd a leer y cargar el nuevo archivo .service. Este paso es esencial
Habilitar iniciosudo systemctl enable nextjs-app.serviceConfigura el servicio para que inicie automáticamente en cada arranque del sistema
Iniciar ahorasudo systemctl start nextjs-app.serviceInicia el servicio inmediatamente, sin necesidad de reiniciar

Verificar y depurar

Utiliza estos comandos para confirmar que la aplicación se está ejecutando correctamente:

TareaComando
Ver estadosystemctl status nextjs-app.service
Ver logs en vivosudo journalctl -u nextjs-app.service -f
Reiniciar serviciosudo systemctl restart nextjs-app.service

Buenas prácticas

  • Ejecuta daemon-reload después de cada cambio — siempre que crees o modifiques un archivo .service, recarga Systemd para que los cambios surtan efecto.
  • Usa enable junto con start — habilitar un servicio solo configura el inicio automático en el arranque; no lo inicia en el momento. Combina ambos comandos para activarlo de inmediato.
  • Prefiere reload sobre restart cuando sea posible — si el servicio soporta recarga de configuración en caliente, usa reload para evitar interrupciones en las conexiones activas.
  • Consulta los logs con journalctl — usa sudo journalctl -u nombre.service -f para depurar servicios en tiempo real y diagnosticar fallos rápidamente.
  • Especifica rutas absolutas en ExecStart — el entorno de ejecución de Systemd es mínimo y no carga el PATH completo del usuario. Usa which para obtener la ruta al binario.
  • Configura Restart=always en servicios críticos — garantiza que el servicio se recupere automáticamente ante caídas inesperadas.
  • Revisa los servicios fallidos periódicamente — ejecuta systemctl --failed para identificar servicios que requieren atención.
  • Usa un usuario no root en User — ejecutar servicios con un usuario específico y con privilegios limitados reduce la superficie de ataque en caso de una vulnerabilidad.