Debian

systemd:服務缺少 ExecStart= 和 ExecStop= 設置。拒絕

  • September 30, 2017

我正在嘗試通過systemd. 這是我的服務文件:

[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

我把它複製到/lib/systemd/system/myapp.service. 然後我執行:

sudo systemctl enable myapp

然後我檢查狀態:

sudo systemctl status myapp

我看到這些錯誤:

● 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.

當我這樣做時,which java我看到:

pi@raspberrypi:/lib/systemd/system $ which java
/usr/bin/java

所以我不明白為什麼systemd抱怨可執行路徑。有什麼想法可以解決嗎?

sudo路徑不是絕對的。如果您的 systemd 單元是系統單元,則無論如何都不需要 sudo,因為系統單元預設以 root 身份執行。

編輯:與其以 root 身份執行 JVM 和整個 Java 應用程序,不如以非特權使用者身份執行該服務。如果應用程序需要某些通常不授予非特權使用者的功能,則可以通過AmbientCapabilities設置添加它。例如,通過將以下行添加到該[Service]部分:

AmbientCapabilities=CAP_SYS_RAWIO
User=nobody

該服務以使用者身份執行,nobody但被授予該CAP_SYS_RAWIO功能。

引用自:https://unix.stackexchange.com/questions/395131