Saya mencoba menjalankan aplikasi saya sebagai daemon/layanan pada distro Debian melalui systemd
. Ini file layanan saya:
[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
Saya menyalinnya ke /lib/systemd/system/myapp.service
. Saya kemudian menjalankan:
sudo systemctl enable myapp
Saya kemudian memeriksa statusnya:
sudo systemctl status myapp
Dan saya melihat kesalahan ini:
● 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.
Ketika saya melakukan which java
Saya melihat:
[email protected]:/lib/systemd/system $ which java
/usr/bin/java
Jadi saya tidak mengerti mengapa systemd
mengeluh tentang jalur yang dapat dieksekusi. Ada ide bagaimana saya bisa memecahkan masalah?
Jawaban yang Diterima:
sudo
jalan tidak mutlak. Jika unit systemd Anda adalah unit sistem, sudo seharusnya tidak diperlukan, karena unit sistem dijalankan sebagai root secara default.
EDIT:daripada menjalankan JVM dan seluruh aplikasi Java sebagai root, mungkin akan lebih baik untuk menjalankan layanan sebagai pengguna yang tidak memiliki hak istimewa. Jika aplikasi membutuhkan beberapa kemampuan yang biasanya tidak diberikan kepada pengguna yang tidak memiliki hak istimewa, itu dapat ditambahkan dengan AmbientCapabilities
pengaturan. Misalnya, dengan menambahkan baris berikut ke [Service]
bagian:
AmbientCapabilities=CAP_SYS_RAWIO
User=nobody
layanan dijalankan sebagai pengguna nobody
tetapi diberikan CAP_SYS_RAWIO
kemampuan.