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
を実行すると なるほど:
[email protected]:/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
が付与されます 機能。