systemd:服务缺少 ExecStart= 和 ExecStop= 设置。拒绝

sme*_*eeb 4 debian systemd services daemon

我正在尝试通过 Debian 发行版将我的应用程序作为守护进程/服务运行systemd。这是我的服务文件:

\n\n
[Unit]\nDescription=MyApp Service\nAfter=multi-user.target\n\n[Service]\nType=simple\nRestart=always\nExecStart=sudo /usr/bin/java -jar /home/pi/myapp.jar\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

我将其复制到/lib/systemd/system/myapp.service. 然后我运行:

\n\n
sudo systemctl enable myapp\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我检查状态:

\n\n
sudo systemctl status myapp\n
Run Code Online (Sandbox Code Playgroud)\n\n

我看到这些错误:

\n\n
\xe2\x97\x8f myapp.service - MyApp Service\n   Loaded: error (Reason: Invalid argument)\n   Active: inactive (dead)\n\nSep 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\nSep 29 09:56:24 raspberrypi systemd[1]: myapp.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我这样做时,which java我看到:

\n\n
pi@raspberrypi:/lib/systemd/system $ which java\n/usr/bin/java\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我不明白为什么systemd抱怨可执行路径。我有什么想法可以解决问题吗?

\n

Joh*_*éen 5

sudo路径不是绝对的。如果您的 systemd 单元是系统单元,则无论如何都不需要 sudo,因为系统单元默认以 root 身份运行。

编辑:与其以 root 身份运行 JVM 和整个 Java 应用程序,不如以非特权用户身份运行该服务。如果应用程序需要某些通常不会授予非特权用户的功能,则可以通过AmbientCapabilities设置添加它。例如,通过将以下行添加到该[Service]部分:

AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
Run Code Online (Sandbox Code Playgroud)

该服务以用户身份运行nobody,但被授予该CAP_SYS_RAWIO功能。