Я переезжаю извыскочкаксистемд. У меня возникли некоторые трудности с переходом на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 варианта.
Расширьте все ваши переменные вручную. То есть используйте
CATALINA_BASE=/d01/tomcat/prod/xyz/1
.Оцените файл с помощью оболочки:
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. :|