web-dev-qa-db-ja.com

systemd:サービスにExecStart =とExecStop =の両方の設定がありません。拒否する

私はsystemdを介してDebianディストリビューションでデーモン/サービスとしてアプリを実行しようとしています。これが私のサービスファイルです:

[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
smeeb

Sudoパスは絶対パスではありません。 systemdユニットがシステムユニットの場合、システムユニットはデフォルトでrootとして実行されるため、いずれにしてもSudoは必要ありません。

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

AmbientCapabilities=CAP_SYS_RAWIO
User=nobody

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

3
Johan Myréen