Ich versuche, meine App als Daemon/Dienst auf einer Debian-Distribution über systemd
auszuführen . Hier ist meine Servicedatei:
[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
Ich kopiere das nach /lib/systemd/system/myapp.service
. Ich führe dann aus:
sudo systemctl enable myapp
Ich überprüfe dann den Status:
sudo systemctl status myapp
Und ich sehe diese Fehler:
● 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.
Wenn ich which java
mache Ich sehe:
[email protected]:/lib/systemd/system $ which java
/usr/bin/java
Ich verstehe also nicht, warum systemd
beschwert sich über den ausführbaren Pfad. Irgendwelche Ideen, wie ich Fehler beheben kann?
Akzeptierte Antwort:
Das sudo
Pfad ist nicht absolut. Wenn Ihre Systemeinheit eine Systemeinheit ist, sollte sudo sowieso nicht erforderlich sein, da Systemeinheiten standardmäßig als root ausgeführt werden.
BEARBEITEN:Anstatt die JVM und die gesamte Java-Anwendung als Root auszuführen, wäre es wahrscheinlich besser, den Dienst als nicht privilegierten Benutzer auszuführen. Wenn die Anwendung Funktionen benötigt, die normalerweise nicht privilegierten Benutzern gewährt werden, können diese mit den AmbientCapabilities
hinzugefügt werden Einstellung. Beispielsweise durch Hinzufügen der folgenden Zeilen zu [Service]
Abschnitt:
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
der Dienst wird als Benutzer nobody
ausgeführt erhält aber den CAP_SYS_RAWIO
Fähigkeit.