J'essaie d'exécuter mon application en tant que démon/service sur une distribution Debian via systemd
. Voici mon fichier de service :
[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
Je copie cela dans /lib/systemd/system/myapp.service
. Je lance alors :
sudo systemctl enable myapp
Je vérifie ensuite l'état :
sudo systemctl status myapp
Et je vois ces erreurs :
● 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.
Quand je fais which java
Je vois :
[email protected]:/lib/systemd/system $ which java
/usr/bin/java
Donc je ne comprends pas pourquoi systemd
se plaint du chemin exécutable. Des idées sur la façon dont je peux résoudre les problèmes ?
Réponse acceptée :
Le sudo
chemin n'est pas absolu. Si votre unité systemd est une unité système, le sudo ne devrait de toute façon pas être nécessaire, car les unités système sont exécutées en tant que root par défaut.
EDIT :au lieu d'exécuter la JVM et l'ensemble de l'application Java en tant que root, il serait probablement préférable d'exécuter le service en tant qu'utilisateur non privilégié. Si l'application a besoin d'une capacité qui n'est normalement pas accordée aux utilisateurs non privilégiés, elle peut être ajoutée avec le AmbientCapabilities
paramètre. Par exemple, en ajoutant les lignes suivantes au [Service]
rubrique :
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
le service est exécuté en tant qu'utilisateur nobody
mais obtient le CAP_SYS_RAWIO
capacité.