Snažím se spustit svou aplikaci jako démona/službu v distribuci Debianu přes systemd
. Zde je můj soubor služeb:
[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
Zkopíruji to do /lib/systemd/system/myapp.service
. Potom spustím:
sudo systemctl enable myapp
Poté zkontroluji stav:
sudo systemctl status myapp
A vidím tyto chyby:
● 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.
Když udělám which java
Vidím:
[email protected]:/lib/systemd/system $ which java
/usr/bin/java
Takže nechápu, proč systemd
si stěžuje na cestu ke spustitelnému souboru. Nějaké nápady, jak mohu odstranit potíže?
Přijatá odpověď:
sudo
cesta není absolutní. Pokud je vaše systemd jednotka systémová jednotka, sudo by stejně nebylo nutné, protože systémové jednotky jsou ve výchozím nastavení spuštěny jako root.
EDIT:místo spouštění JVM a celé Java aplikace jako root by asi bylo lepší spouštět službu jako neprivilegovaný uživatel. Pokud aplikace potřebuje nějakou schopnost, která není běžně přiznávána neprivilegovaným uživatelům, lze ji přidat pomocí AmbientCapabilities
nastavení. Například přidáním následujících řádků do [Service]
sekce:
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
služba je spuštěna jako uživatel nobody
ale má uděleno CAP_SYS_RAWIO
schopnosti.