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
。