Saya menulis file unit systemd untuk aplikasi Java dan saya ingin mengontrol versi Java yang digunakan untuk memulai. File layanan saya (disederhanakan) adalah
[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143
Ketika mencoba untuk memulainya saya mendapatkan kesalahan kembali
Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/[email protected]:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: [email protected] lacks both ExecStart= and ExecStop= setting. Refusing.
Saya tahu itu JAVA_HOME
diatur dengan benar; jika saya mengubah ExecStart
baris untuk memulai /usr/bin/java
dan kemudian menambahkan sesuatu seperti -DsomeOption=${JAVA_HOME}
saya bisa melihatnya dengan baik.
Solusi yang jelas adalah membuat skrip wrapper tetapi saya merasa itu mengalahkan titik menggunakan file layanan.
Bagaimana saya bisa mengatur JAVA_HOME untuk aplikasi Java saya menggunakan file unit?
Jawaban:
Dari bagian "Baris perintah" di systemd.service (5):
Saya akan menyarankan menggunakan specifier contoh
%i
(Anda dapat membaca lebih lanjut tentang hal itu di systemd.unit (5)), tetapi (sekarang kita kembali di systemd.service (5)):Saya pikir opsi terbaik pada saat ini benar-benar adalah membuat skrip shell yang membungkus pelaksanaan binary java seperti yang disarankan oleh Warren Young atau Anda bisa ExecStart shell secara langsung seperti dalam contoh untuk baris perintah shell di bagian "Command Lines" dari systemd.service (5) yang memiliki contoh berikut:
sehingga Anda dapat melakukan (belum diuji):
sumber
Pilihan lain yang serupa adalah menggunakan
/usr/bin/env
:Dengan cara ini Anda dapat menghilangkan
'
tanda kutip di seluruh perintah yang berguna jika Anda perlu membuat sarang barang yang dikutip.PS. Sebagai catatan tambahan, penting untuk menyertakan nama variabel dalam
{
kurung kurawal}
di file Systemd atau mereka tidak akan dikenali dengan benar.sumber