Generador de archivos de servicio systemd

Escribe el comando, el usuario y cómo debe reiniciarse el servicio, y obtén un archivo .service listo para systemd, con la ruta donde guardarlo y los comandos systemctl para arrancarlo ahora y en cada inicio. Sirve para servicios del sistema y para servicios de usuario sin root.

Instalar como
Una CLAVE=valor por línea; las líneas que empiezan por # se ignoran

Guárdalo como /etc/systemd/system/myapp.service

Funciona en tu navegador: nada de lo que escribes se envía a ningún sitio.

Cómo se usa

  1. Escribe el nombre del servicio (el nombre del archivo sin .service), una descripción y el comando con su ruta completa.
  2. Indica el directorio de trabajo y, para un servicio del sistema, el usuario con el que se ejecuta. Si dejas el usuario vacío, el servicio se ejecuta como root.
  3. Elige el tipo y la política de reinicio, añade variables de entorno, una por línea, y marca las opciones.
  4. Guarda el archivo en la ruta indicada y ejecuta los comandos: daemon-reload, enable –now y luego status y journalctl para comprobarlo.

Cómo funciona

La unidad tiene tres secciones:

  • [Unit]: la descripción y el orden de arranque. Un servicio del sistema recibe After=network.target, o After= y Wants=network-online.target si necesita la red. Un servicio de usuario no lleva orden de red, porque el gestor de usuario no puede esperar a unidades del sistema.
  • [Service]: Type, User y Group, WorkingDirectory, un Environment=“CLAVE=valor” por variable (con \ y “ escapadas), EnvironmentFile, ExecStart, Restart y RestartSec y, con la protección, NoNewPrivileges=true y PrivateTmp=true.
  • [Install]: WantedBy=multi-user.target para un servicio del sistema o default.target para uno de usuario; es donde se engancha enable.

Ejemplo

El formulario por defecto (nombre myapp, servidor Node.js, usuario myapp, reinicio si falla tras 5 s, dos variables, network-online y protección) da:

[Unit]
Description=My app
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
Environment="NODE_ENV=production"
Environment="PORT=3000"
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Guardado como /etc/systemd/system/myapp.service, se arranca con sudo systemctl daemon-reload y sudo systemctl enable --now myapp.service.

Consejos

  • systemd expande los especificadores % en ExecStart y Environment: escribe %% para un signo de porcentaje literal.
  • ExecStart no pasa por una shell, así que tuberías, && y redirecciones no funcionan; envuélvelos en /bin/sh -c ‘…’ o en un script.
  • No pongas secretos en el archivo de unidad: guárdalos en un EnvironmentFile que solo pueda leer root.
  • Tras cada cambio en el archivo, ejecuta daemon-reload y reinicia el servicio.

Preguntas frecuentes

¿Dónde guardo el archivo?

Un servicio del sistema va en /etc/systemd/system/<nombre>.service (hace falta root). Un servicio de usuario va en ~/.config/systemd/user/<nombre>.service y se ejecuta con tu cuenta. La ruta aparece debajo del archivo de unidad.

¿Qué Type elijo?

simple sirve para la mayoría de programas que se quedan en primer plano: servidores Node.js, Python o Go. Usa forking solo para demonios antiguos que pasan a segundo plano y terminan, oneshot para scripts que se ejecutan y acaban, y notify para programas que llaman a sd_notify cuando están listos.

¿Qué diferencia hay entre Restart=on-failure y always?

on-failure reinicia el servicio cuando termina con un código de error, lo mata una señal o agota el tiempo, pero no tras una salida limpia. always lo reinicia en todos los casos. RestartSec fija la pausa antes del reinicio.

¿Por qué network-online.target y no network.target?

After=network.target solo ordena el servicio después de preparar la pila de red, no después de configurar una dirección. Si tu servicio debe conectarse a algún sitio al arrancar, network-online.target junto con Wants= espera a que la red funcione de verdad.

¿Necesito la ruta completa en ExecStart?

systemd acepta una ruta absoluta o solo el nombre del programa, que busca en su propia ruta fija (como /usr/local/bin y /usr/bin), no en el PATH de tu shell. Una ruta relativa como ./app no se admite. Las rutas completas son lo más seguro.

¿Un servicio de usuario puede arrancar con el sistema?

Un servicio de usuario arranca cuando inicias sesión. Para que arranque con el sistema sin iniciar sesión, ejecuta una vez sudo loginctl enable-linger <tu usuario>.

Más en Desarrollo

Todas las herramientas de la categoría: Desarrollo ·Actualizado el 4 de noviembre de 2026

Opciones de privacidad

Google Analytics nos muestra qué herramientas se usan y si funcionan. Puede usar cookies. Tu elección se guarda en este navegador.