Я пишу системный файл модуля для приложения Java, и я хотел бы контролировать версию Java, используемую для его запуска. Мой (упрощенный) сервисный файл
[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
При попытке запустить получаю ошибку обратно
Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/app@.service:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: app@1.0.0.service lacks both ExecStart= and ExecStop= setting. Refusing.
Я знаю, что JAVA_HOME
это правильно установлено; если я изменю ExecStart
строку, чтобы начать с, /usr/bin/java
а затем добавить что-то вроде, -DsomeOption=${JAVA_HOME}
я вижу это просто отлично.
Очевидный обходной путь заключается в создании сценария-обертки, но я чувствую, что он лишает смысла использование служебного файла.
Как я могу установить JAVA_HOME для моего Java-приложения, используя файл модуля?
Ответы:
Из раздела «Командные строки» в systemd.service (5):
Я собирался предложить использовать спецификатор экземпляра
%i
(вы можете прочитать об этом больше в systemd.unit (5)), но (теперь мы вернулись в systemd.service (5)):Я думаю, что на данный момент лучшим вариантом на самом деле является создание сценария оболочки, который оборачивает выполнение двоичного файла Java, как это было предложено Уорреном Янгом, или вы можете напрямую выполнить ExecStart оболочку, как в примере для командных строк оболочки в разделе «Командные строки» systemd.service (5), который имеет следующий пример:
так что вы могли бы сделать (не проверено):
источник
Еще один аналогичный вариант заключается в использовании
/usr/bin/env
:Таким образом, вы можете опускать
'
кавычки вокруг всей команды, что полезно, если вам нужно вложить кавычки.PS. В качестве дополнительного примечания важно заключить имена переменных в
{
фигурные скобки}
в файлы Systemd, иначе они не будут распознаваться правильно.источник