Cómo se usa
- Escribe el nombre del servicio (el nombre del archivo sin .service), una descripción y el comando con su ruta completa.
- 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.
- Elige el tipo y la política de reinicio, añade variables de entorno, una por línea, y marca las opciones.
- 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.