systemd, EnvironmentFile, повторное использование переменных — как?

systemd, EnvironmentFile, повторное использование переменных — как?

Я переезжаю извыскочкаксистемд. У меня возникли некоторые трудности с переходом наEnvironmentFileдиректива. Я не могу получить этоEnvironmentFileработать:

########################################################
# Catalina Settings
CLUSTER_BASE=/d01/tomcat/prod/xyz
CATALINA_BASE=$CLUSTER_BASE/1
CATALINA_TMPDIR=$CATALINA_BASE/temp
CATALINA_HOME=/usr/share/tomcat7
CATALINA_PID=/run/tomcat/tc-prod-xyz-1.pid

########################################################
# Java Settings
JAVA_HOME=/usr/lib/jvm/default-java/jre
JAVA_OPTS=-Djava.awt.headless=true
JAVA_OPTS=$JAVA_OPTS -server
JAVA_OPTS=$JAVA_OPTS -Xms2048m
JAVA_OPTS=$JAVA_OPTS -Xmx2048m
JAVA_OPTS=$JAVA_OPTS -XX:MaxPermSize=2048m
JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC
JAVA_OPTS=$JAVA_OPTS -XX:+AggressiveHeap
JAVA_OPTS=$JAVA_OPTS -javaagent:$CLUSTER_BASE/newrelic/newrelic.jar

Похоже, что этот тип утверждения, в котором я повторно использую переменную:

JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC

не поддерживается всистемдкак это было ввыскочка. Делаетсистемдподдержать что-то подобное или мне нужно сделать одно длинное и трудночитаемое заявление?

решение1

К сожалению, этот файл на самом деле является скриптом оболочки. В прошлом большинство систем инициализации/скриптов интерпретировали файлы, которые предоставляли переменные среды с помощью оболочки, поэтому вы могли обойтись без выполнения в них действий оболочки. Однако Systemd этого не делает. Файл среды на самом деле является файлом среды, а не скриптом. Это задокументировано вsystemd.execстраница руководства:

Внутри строк не выполняется расширение переменных, однако возможно расширение спецификатора. Символ $ не имеет специального значения.

Поэтому у вас есть 2 варианта.

  1. Расширьте все ваши переменные вручную. То есть используйте CATALINA_BASE=/d01/tomcat/prod/xyz/1.

  2. Оцените файл с помощью оболочки:
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

решение2

Нужно ли мне сделать одно длинное и трудночитаемое заявление?

Нет

Строка, заканчивающаяся обратной косой чертой, будет объединена со следующей, что позволит определять многострочные переменные.

решение3

В конкретном случае Tomcat (как в этом вопросе) я обнаружил, что проще поместить большинство этих настроек в bin/setenv.sh, который выполняется Tomcat при запуске и оценивает переменные в скрипте оболочки, как и ожидалось.

Поэтому в /etc/systemd/system/tomcat.serviceя указываю только Environmentпеременные для CATALINA_BASEи CATALINA_HOME, а затем помещаю все остальное в ${CATALINA_BASE}/bin/setenv.sh.

решение4

Другой вариант: иметь вторичный блок, который запускается перед этим и создает, который EnvironmentFileон может использовать:https://stackoverflow.com/a/42841480/32453

Вторичный блок может использовать, например, bash. Кажется, это способ systemdимпорта env. :|

Связанный контент