Sto cercando di eseguire la mia app come demone/servizio su una distribuzione Debian tramite systemd
. Ecco il mio file di servizio:
[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 in /lib/systemd/system/myapp.service
. Quindi eseguo:
sudo systemctl enable myapp
Quindi controllo lo stato:
sudo systemctl status myapp
E vedo questi errori:
● 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.
Quando eseguo which java
Vedo:
[email protected]:/lib/systemd/system $ which java
/usr/bin/java
Quindi non capisco perché systemd
si lamenta del percorso eseguibile. Qualche idea su come posso risolvere i problemi?
Risposta accettata:
Il sudo
il percorso non è assoluto. Se la tua unità systemd è un'unità di sistema, sudo non dovrebbe essere comunque necessario, poiché le unità di sistema vengono eseguite come root per impostazione predefinita.
EDIT:invece di eseguire la JVM e l'intera applicazione Java come root, sarebbe probabilmente meglio eseguire il servizio come utente non privilegiato. Se l'applicazione necessita di alcune funzionalità normalmente non concesse a utenti non privilegiati, può essere aggiunta con AmbientCapabilities
collocamento. Ad esempio, aggiungendo le seguenti righe a [Service]
sezione:
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
il servizio viene eseguito come utente nobody
ma viene concesso il CAP_SYS_RAWIO
capacità.