Save 15% on All Hosting Services

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código: Skills Comenzar
Secciones
Administración Linux Servidores virtuales

Cómo usar systemd para iniciar un servicio de Linux al arrancar

Garantizar que los servicios críticos se inicien automáticamente cuando el servidor se reinicia es una de las responsabilidades más fundamentales de cualquier administrador de sistemas Linux. Ya sea que ejecute una aplicación web, un motor de base de datos o un daemon personalizado en un entorno de VPS Hosting, un reinicio inesperado nunca debería significar un tiempo de inactividad prolongado. Con systemd — el sistema init moderno que alimenta la mayoría de las distribuciones Linux actuales — puede definir precisamente cómo, cuándo y como quién se lanzan sus servicios, todo a través de un archivo de unidad limpio y declarativo.

Esta guía completa lo guía a través de cada paso: entender qué es systemd, crear un archivo de unidad de servicio listo para producción, verificar permisos, probar su ejecutable y administrar el ciclo de vida del servicio. Al final, su aplicación personalizada sobrevivirá a cada reinicio automáticamente.

¿Qué es systemd y por qué es importante?

systemd es un sistema init y administrador de servicios que reemplazó alternativas más antiguas como SysVinit y Upstart en la mayoría de las principales distribuciones Linux, incluidas Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux y Fedora. En lugar de ejecutar una cadena secuencial de scripts de shell al arrancar, systemd paraleliza el inicio del servicio, resuelve el ordenamiento de dependencias y administra todo el ciclo de vida de los procesos del sistema desde una única interfaz unificada.

Ventajas clave de systemd para entornos de servidor

CaracterísticaBeneficio
Inicio paralelo de serviciosTiempos de arranque más rápidos en servidores con múltiples servicios
Gestión de dependenciasLos servicios se inician solo después de que sus requisitos previos estén listos
Políticas de reinicio automáticoLos servicios bloqueados se recuperan sin intervención manual
Registro centralizado a través de journaldToda la salida del servicio se captura en un diario consultable
Control de recursos basado en cgroupLos límites de CPU y memoria se aplican por servicio
Activación de socket y dispositivoLos servicios se inician bajo demanda, no incondicionalmente

Para cualquiera que administre aplicaciones en Servidores Dedicados o instancias VPS, estas capacidades se traducen directamente en mayor tiempo de actividad y comportamiento más predecible bajo carga.

Entendiendo los archivos de unidad de systemd

Todo lo que systemd administra se representa mediante un archivo de unidad — un archivo de configuración de texto plano dividido en secciones. Un archivo de unidad .service le dice a systemd:

  • Qué es el servicio (metadatos, descripción, dependencias)
  • Cómo ejecutarlo (ruta del ejecutable, directorio de trabajo, contexto del usuario)
  • Cuándo iniciarlo (objetivo de arranque, ordenamiento relativo a otras unidades)
  • Qué hacer si falla (política de reinicio, retraso de reinicio)

Los archivos de unidad de servicio para servicios en todo el sistema se encuentran en /etc/systemd/system/. Los archivos colocados aquí tienen prioridad sobre las unidades suministradas por el proveedor en /lib/systemd/system/ y persisten en las actualizaciones de paquetes.

Paso a paso: Creando una unidad de servicio systemd

El siguiente tutorial utiliza una aplicación ficticia llamada myapp. Reemplace cada instancia de myapp, myuser y /usr/bin/myapp con valores apropiados para su propio entorno.

Paso 1: Preparar el directorio de trabajo

Antes de escribir el archivo de unidad, decida desde dónde se ejecutará su aplicación. Un directorio de trabajo dedicado mantiene los archivos de configuración, registros y datos en tiempo de ejecución organizados y hace que la gestión de permisos sea sencilla.

Cree el directorio si aún no existe:

sudo mkdir -p /opt/myapp

> ¿Por qué /opt/ en lugar de /etc/systemd/?

> El árbol /etc/systemd/ está reservado para la propia configuración de systemd. Colocar datos de aplicación allí no es estándar y puede causar confusión. Use /opt/myapp, /srv/myapp o /var/lib/myapp dependiendo de la categoría del Estándar de Jerarquía del Sistema de Archivos que mejor se ajuste a su carga de trabajo.

Asigne la propiedad al usuario que ejecutará el servicio:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myuser
sudo chown -R myuser:myuser /opt/myapp

Usar una cuenta de sistema dedicada (sin shell de inicio de sesión, sin directorio de inicio) es una práctica recomendada de seguridad. Limita el radio de explosión si la aplicación alguna vez se ve comprometida.

Verifique el resultado:

ls -ld /opt/myapp
# Expected output: drwxr-xr-x 2 myuser myuser 4096 Jan 1 00:00 /opt/myapp

Paso 2: Crear el archivo de unidad de servicio

Abra un nuevo archivo de unidad con su editor preferido:

sudo nano /etc/systemd/system/myapp.service

Pegue el siguiente contenido, ajustando los valores para que coincidan con su aplicación:

[Unit]
Description=My Custom Application
Documentation=https://example.com/docs
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp --config /opt/myapp/myapp.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Guarde el archivo con Ctrl+O y luego salga con Ctrl+X.

Paso 3: Entendiendo cada directiva

Sección [Unit]

DirectivaPropósito
DescriptionNombre legible por humanos que se muestra en la salida de systemctl status
DocumentationReferencia de URL o página de manual para el servicio
AfterGarantiza que el servicio se inicie *después* de que la unidad listada esté activa
WantsDependencia suave — systemd *intentará* iniciar la unidad listada pero no fallará si no está disponible

> network-online.target vs network.target: Use network-online.target (combinado con Wants=network-online.target) para servicios que genuinamente necesitan una interfaz de red completamente configurada — por ejemplo, una aplicación que se conecta a una base de datos remota o a una API externa al inicio. network.target solo garantiza que el subsistema de red ha sido *iniciado*, no que las interfaces estén activas y las direcciones asignadas.

Sección [Service]

DirectivaPropósito
Type=simpleEl proceso iniciado por ExecStart es el proceso principal (predeterminado para la mayoría de las aplicaciones)
ExecStartRuta completa al binario y cualquier argumento. Siempre use rutas absolutas.
ExecReloadComando para recargar la configuración sin un reinicio completo (opcional pero recomendado)
Restart=on-failureReinicie el servicio solo cuando salga con un código distinto de cero o sea eliminado por una señal. Use always si desea reinicios incluso en salidas limpias.
RestartSecSegundos a esperar antes de intentar un reinicio
User / GroupEjecute el proceso como este usuario/grupo en lugar de root
WorkingDirectoryEstablezca el directorio actual antes de ejecutar ExecStart
StandardOutput / StandardErrorEnrute stdout/stderr al diario de systemd
SyslogIdentifierEtiqueta utilizada para filtrar entradas de diario para este servicio
NoNewPrivilegesEvita que el proceso obtenga privilegios adicionales a través de binarios setuid
ProtectSystem=strictMonta /usr, /boot y /etc como de solo lectura para el servicio
ProtectHomeHace que /home, /root y /run/user sean inaccesibles
PrivateTmpProporciona al servicio su propio espacio de nombres /tmp privado

Sección [Install]

DirectivaPropósito
WantedBy=multi-user.targetHabilita el servicio cuando el sistema alcanza el nivel de ejecución estándar multiusuario (no gráfico). Este es el objetivo correcto para prácticamente todos los daemons de servidor.

Paso 4: Verificar permisos de archivo y directorio

Antes de recargar systemd, confirme que el usuario del servicio pueda acceder realmente a todo lo que necesita:

# Check working directory ownership and permissions
ls -ld /opt/myapp

# Confirm the executable exists and is executable
ls -l /usr/bin/myapp

# Verify the config file is readable by myuser
sudo -u myuser cat /opt/myapp/myapp.conf

Si alguna de estas comprobaciones falla, corrija los permisos antes de continuar:

# Make the binary executable
sudo chmod +x /usr/bin/myapp

# Grant read access to the config file
sudo chmod 640 /opt/myapp/myapp.conf
sudo chown myuser:myuser /opt/myapp/myapp.conf

Paso 5: Probar el ejecutable manualmente

Siempre verifique que su aplicación se ejecute correctamente *antes* de entregar el control a systemd. Esto aísla los errores de la aplicación de los problemas de configuración de systemd:

sudo -u myuser /usr/bin/myapp --config /opt/myapp/myapp.conf

Si la aplicación se inicia sin errores, presione Ctrl+C para detenerla y continuar. Si falla, solucione la aplicación en sí — verifique que todas las dependencias estén instaladas, las variables de entorno estén configuradas y los puertos requeridos estén disponibles.

Paso 6: Recargar systemd y habilitar el servicio

Después de guardar el archivo de unidad, indique a systemd que vuelva a leer su configuración:

sudo systemctl daemon-reload

Habilite el servicio para que se inicie automáticamente en cada reinicio posterior:

sudo systemctl enable myapp.service

Este comando crea un enlace simbólico en el directorio .wants apropiado, vinculando su archivo de unidad a la secuencia de arranque multi-user.target. Debería ver una salida similar a:

Created symlink /etc/systemd/system/multi-user.target.wants/myapp.service → /etc/systemd/system/myapp.service.

Inicie el servicio inmediatamente sin reiniciar:

sudo systemctl start myapp.service

Paso 7: Verificar que el servicio se está ejecutando

Verifique el estado actual del servicio:

sudo systemctl status myapp.service

Un servicio saludable produce una salida como esta:

● myapp.service - My Custom Application
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2025-01-01 12:00:00 UTC; 5s ago
   Main PID: 12345 (myapp)
      Tasks: 4 (limit: 4915)
     Memory: 12.3M
        CPU: 45ms
     CGroup: /system.slice/myapp.service
             └─12345 /usr/bin/myapp --config /opt/myapp/myapp.conf

Campos clave a verificar:

  • Loaded — confirma que el archivo de unidad se analizó correctamente y muestra si está enabled o disabled para el arranque
  • Active: active (running) — el servicio se está ejecutando actualmente
  • Main PID — el ID de proceso de su aplicación

Paso 8: Monitorear registros con journalctl

systemd enruta toda la salida del servicio al diario, un almacén de registros estructurado y consultable. Use journalctl para inspeccionarlo:

# View all logs for myapp (most recent last)
journalctl -u myapp.service

# Follow live log output (like tail -f)
journalctl -u myapp.service -f

# Show only logs since the last boot
journalctl -u myapp.service -b

# Show the last 50 lines
journalctl -u myapp.service -n 50

# Show logs since a specific time
journalctl -u myapp.service --since "2025-01-01 12:00:00"

Si su servicio no se inicia, el diario casi siempre contiene el mensaje de error exacto que explica por qué. Este es el primer lugar donde buscar antes de hacer cambios.

Paso 9: Probar el comportamiento de arranque

Para confirmar que el servicio sobrevive a un reinicio sin inspeccionar manualmente la secuencia de arranque, puede simularlo:

# Reboot the server (only if safe to do so)
sudo reboot

Después de que el servidor vuelva a estar en línea, verifique el estado del servicio nuevamente:

sudo systemctl status myapp.service

Si muestra active (running), su servicio está correctamente configurado para inicio automático.

Administrando el ciclo de vida del servicio

Una vez que su servicio se está ejecutando, utilizará los siguientes comandos regularmente:

Comandos systemctl comunes

# Start the service
sudo systemctl start myapp.service

# Stop the service gracefully
sudo systemctl stop myapp.service

# Restart the service (stop + start)
sudo systemctl restart myapp.service

# Reload configuration without restarting (if ExecReload is defined)
sudo systemctl reload myapp.service

# Enable automatic startup at boot
sudo systemctl enable myapp.service

# Disable automatic startup at boot
sudo systemctl disable myapp.service

# Check whether the service is enabled
sudo systemctl is-enabled myapp.service

# Check whether the service is currently active
sudo systemctl is-active myapp.service

# View the full unit file as systemd interprets it
sudo systemctl cat myapp.service

# Edit the unit file and reload in one step
sudo systemctl edit --full myapp.service

Solución de problemas comunes

El servicio no se inicia: “No such file or directory”

Esto generalmente significa que ExecStart apunta a un binario inexistente o WorkingDirectory no existe. Verifique ambas rutas:

which myapp
ls -l /opt/myapp

El servicio se inicia pero sale inmediatamente

Verifique el diario para la salida de error propia de la aplicación:

journalctl -u myapp.service -n 100 --no-pager

También verifique que Type=simple sea correcto para su aplicación. Si su binario se bifurca a sí mismo en el fondo, use Type=forking en su lugar.

Errores de “Permission denied”

El usuario del servicio no tiene acceso a un archivo o directorio requerido. Use ls -l para auditar permisos y sudo -u myuser para probar el acceso interactivamente.

Puerto ya en uso

Otro proceso está vinculado al puerto que su aplicación necesita. Identifíquelo con:

sudo ss -tlnp | grep :<port>

El servicio se reinicia en un bucle

Si Restart=on-failure causa bucles de reinicio rápido, systemd eventualmente limitará los reinicios. Verifique StartLimitIntervalSec y StartLimitBurst en la sección [Unit] para ajustar este comportamiento, e investigue siempre la causa raíz en el diario.

Patrones avanzados de systemd para servidores de producción

Variables de entorno y archivos de entorno

Nunca codifique secretos en archivos de unidad. Use un archivo de entorno en su lugar:

[Service]
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/myapp

Cree /etc/myapp/myapp.env con chmod 600 y chown root:myuser para restringir el acceso:

DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=supersecretkey

Dependencias de servicio y ordenamiento

Si su aplicación depende de un servicio de base de datos (p. ej., PostgreSQL o MySQL), declare esa dependencia explícitamente:

[Unit]
After=network-online.target postgresql.service
Requires=postgresql.service

Requires es una dependencia dura — si PostgreSQL no se inicia, systemd tampoco intentará iniciar su servicio.

Integración de Watchdog

Para servicios críticos para la misión, habilite el watchdog integrado de systemd para detectar procesos colgados:

[Service]
WatchdogSec=30s
Restart=on-watchdog

Su aplicación debe llamar a sd_notify(0, "WATCHDOG=1") periódicamente para restablecer el temporizador del watchdog. Si no lo hace dentro de WatchdogSec, systemd mata e reinicia el servicio.

Elegir el entorno de alojamiento correcto

Los patrones de configuración de systemd descritos en esta guía se aplican por igual en todos los tipos de servidores Linux, pero su elección de infraestructura de alojamiento afecta cuánto control tiene sobre el sistema init y la gestión de servicios.

  • VPS Hosting — Acceso root completo, control systemd completo, ideal para implementaciones de aplicaciones personalizadas. Los planes VPS de AlexHost se ejecutan en virtualización KVM, lo que le proporciona un entorno de kernel genuinamente aislado.
  • Servidores Dedicados — Rendimiento máximo e aislamiento para servicios que requieren muchos recursos. Acceso completo al hardware sin vecinos ruidosos.
  • VPS con cPanel — Combina acceso systemd a nivel de root con un panel de control gráfico para equipos que administran servicios del sistema y alojamiento web desde una única interfaz.
  • Alojamiento web compartido — Adecuado para aplicaciones web estándar que no requieren servicios de sistema personalizados. Sin acceso root, pero sin gastos generales de administración de servidor.

Si está implementando un daemon personalizado, microservicio o cualquier aplicación que necesite sobrevivir a los reinicios automáticamente, un VPS o servidor dedicado con acceso root completo es la opción apropiada.

Referencia rápida: Lista de verificación completa de servicio systemd

Antes de considerar que su servicio está listo para producción, verifique cada elemento de esta lista de verificación:

  • [ ] Archivo de unidad guardado en /etc/systemd/system/myapp.service
Administración Linux Servidores dedicados
Administración Seguridad
Administración

Save 15% on All Hosting Services

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código: Skills Comenzar
Acceso rápido a la información
Acceso rápido a la información

Ahorre tiempo y obtenga una respuesta rápida a su pregunta

Resuelva los problemas usted mismo
Resuelva los problemas usted mismo

La base de conocimientos contiene tutoriales detallados que le permitirán realizar tareas técnicas por sí mismo.

Mejorar las competencias
Mejorar las competencias

Utilizando la base de conocimientos, podrá ampliar sus conocimientos sobre alojamiento web y temas relacionados

Ilustraciones y diagramas
Ilustraciones y diagramas

Muchos artículos van acompañados de ilustraciones y diagramas, que facilitan la comprensión de procesos y escenarios complejos.

Trucos útiles
Trucos útiles

Encontrarás consejos útiles para mejorar el rendimiento de tu sitio o aplicación web.

Pertinencia de los temas tratados
Pertinencia de los temas tratados

La información de la base de conocimientos se actualiza periódicamente para reflejar los últimos cambios y tendencias en el ámbito de la infraestructura informática y el servicio AlexHost

¿No ha encontrado el tema que buscaba? Hay una solución perfecta

Huéspedes y clientes excepcionales ¡Su comodidad es nuestra prioridad! Si tiene dificultades para instalar algún software específico o desplegar un servidor, no dude en ponerse en contacto con nosotros. Valoramos su opinión y siempre estamos dispuestos a ayudarle a resolver sus problemas.

Además, le damos la oportunidad de participar activamente en la creación de nuestra base de conocimientos. Si tiene temas o preguntas que le gustaría incluir en nuestra base de datos, ¡háganoslo saber! Estamos dispuestos a escribir artículos y guías detallados en función de sus necesidades.

Nos esforzamos por hacer que su experiencia con AlexHost sea lo más cómoda y eficiente posible, y su contribución a la base de conocimientos nos ayuda a lograr este objetivo. Contáctenos ->
info@alexhost.com y díganos cómo podemos hacer que su estancia con nosotros sea aún mejor.

Solution Image