systemd: サービスに ExecStart= および ExecStop= 設定がありません。拒否する

systemd: サービスに ExecStart= および ExecStop= 設定がありません。拒否する

Debianディストリビューションを通じて、アプリケーションをデーモン/サービスとして実行しようとしています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そのため、実行パスについて文句を言う理由を理解できません。問題を解決する方法についてのアイデアはありますか?

ベストアンサー1

パスsudoが絶対的なものではありません。 systemdデバイスがシステムデバイスの場合、システムデバイスはデフォルトでrootとして実行されるため、sudoは必要ありません。

編集:JVMとJavaアプリケーション全体をrootとして実行する代わりに、権限のないユーザーとしてサービスを実行します。アプリケーションに特権のないユーザーに一般的に付与されない特定の機能が必要な場合は、設定で追加できますAmbientCapabilities。たとえば、セクションに次の行を追加します[Service]

AmbientCapabilities=CAP_SYS_RAWIO
User=nobody

サービスはユーザーとして実行されますが、機能が付与nobodyされますCAP_SYS_RAWIO

おすすめ記事