Estoy tratando de ejecutar mi aplicación como un demonio/servicio en una distribución de Debian a través de systemd
. Aquí está mi archivo de servicio:
[Unit]
Description=MyApp Service
After=multi-user.target
[Service]
Type=simple
Restart=always
ExecStart=sudo /usr/bin/java -jar /home/pi/myapp.jar
[Install]
WantedBy=multi-user.target
Lo copio en /lib/systemd/system/myapp.service
. Luego ejecuto:
sudo systemctl enable myapp
Luego compruebo el estado:
sudo systemctl status myapp
Y veo estos errores:
● myapp.service - MyApp Service
Loaded: error (Reason: Invalid argument)
Active: inactive (dead)
Sep 29 09:56:24 raspberrypi systemd[1]: [/lib/systemd/system/myapp.service:8] Executable path is not absolute, ignoring: sudo /usr/bin/java -jar /home/pi/myapp.jar
Sep 29 09:56:24 raspberrypi systemd[1]: myapp.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Cuando hago which java
Veo:
[email protected]:/lib/systemd/system $ which java
/usr/bin/java
Así que no entiendo por qué systemd
se queja de la ruta del ejecutable. ¿Alguna idea de cómo puedo solucionar el problema?
Respuesta aceptada:
El sudo
El camino no es absoluto. Si su unidad systemd es una unidad del sistema, el sudo no debería ser necesario de todos modos, ya que las unidades del sistema se ejecutan como root de forma predeterminada.
EDITAR:en lugar de ejecutar la JVM y toda la aplicación Java como raíz, probablemente sería mejor ejecutar el servicio como un usuario sin privilegios. Si la aplicación necesita alguna capacidad que normalmente no se otorga a los usuarios sin privilegios, se puede agregar con AmbientCapabilities
entorno. Por ejemplo, agregando las siguientes líneas al [Service]
sección:
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
el servicio se ejecuta como usuario nobody
pero se le otorga el CAP_SYS_RAWIO
capacidad.