Piszę plik jednostki systemowej dla aplikacji Java i chciałbym kontrolować wersję Javy używaną do jej uruchomienia. Mój (uproszczony) plik usługi to
[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
Podczas próby uruchomienia pojawia się błąd
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.
Wiem, że JAVA_HOME
jest to poprawnie ustawione; jeśli zmienię ExecStart
wiersz na początek, /usr/bin/java
a następnie dodam coś takiego -DsomeOption=${JAVA_HOME}
, widzę to dobrze.
Oczywistym obejściem jest utworzenie skryptu opakowania, ale wydaje mi się, że pokonuje to sens używania pliku usługi.
Jak ustawić JAVA_HOME dla mojej aplikacji Java za pomocą pliku jednostkowego?
Odpowiedzi:
Z sekcji „Wiersze poleceń” w pliku systemd.service (5):
Chciałem zasugerować użycie specyfikatora instancji
%i
(więcej na ten temat można przeczytać w systemd.unit (5)), ale (teraz wróciliśmy do systemd.service (5)):Myślę, że najlepszą opcją w tym momencie jest stworzenie skryptu powłoki, który otacza wykonanie pliku binarnego java, zgodnie z sugestią Warrena Younga, lub możesz uruchomić powłokę bezpośrednio jak w przykładzie dla linii poleceń powłoki w sekcji „Linie poleceń” systemd.service (5), który ma następujący przykład:
więc możesz zrobić (niesprawdzone):
źródło
Inną podobną opcją jest użycie
/usr/bin/env
:W ten sposób możesz pominąć
'
cudzysłowy wokół całego polecenia, co jest przydatne, jeśli potrzebujesz zagnieżdżać cytowane rzeczy.PS. Na marginesie ważne jest, aby zawrzeć nazwy zmiennych w
{
nawiasach klamrowych}
w plikach Systemd, w przeciwnym razie nie zostaną one poprawnie rozpoznane.źródło