私は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
が実行可能パスについて不平を言っている理由を理解していません。 トラブルシューティングの方法はありますか?
Sudo
パスは絶対パスではありません。 systemdユニットがシステムユニットの場合、システムユニットはデフォルトでrootとして実行されるため、いずれにしてもSudoは必要ありません。
編集:JVMとJavaアプリケーション全体をrootとして実行する代わりに、サービスを非特権ユーザーとして実行することをお勧めします。アプリケーションが通常非特権ユーザーに付与されていない機能を必要とする場合、それはAmbientCapabilities
設定で追加できます。たとえば、次の行を[Service]
セクションに追加します。
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
サービスはユーザーnobody
として実行されますが、CAP_SYS_RAWIO
機能が付与されます。