systemd, EnvironmentFile, 변수 재사용 - 어떻게?

systemd, 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

불행하게도 당신이 가지고 있는 파일은 실제로 쉘 스크립트입니다. 과거에는 대부분의 init 시스템/스크립트가 셸을 사용하여 환경 변수를 제공하는 파일을 해석했으므로 그 안에서 셸 작업을 수행할 필요가 없습니다. 그러나 Systemd는 이를 수행하지 않습니다. 환경 파일은 스크립트가 아닌 진정한 환경 파일입니다. 이는 다음 문서에 문서화되어 있습니다.systemd.exec매뉴얼 페이지:

문자열 내부에서는 변수 확장이 수행되지 않지만, 지정자 확장은 가능합니다. $ 문자에는 특별한 의미가 없습니다.

따라서 두 가지 옵션이 있습니다.

  1. 모든 변수를 수동으로 확장하세요. 사용을 의미합니다 CATALINA_BASE=/d01/tomcat/prod/xyz/1.

  2. 셸을 사용하여 파일을 평가합니다.
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

답변2

읽기 어려운 긴 문장을 만들어야 합니까?

아니요

백슬래시로 끝나는 줄은 다음 줄과 연결되어 여러 줄의 변수 정의를 허용합니다.

답변3

bin/setenv.shTomcat의 특정한 경우(이 질문에서와 같이) 이러한 설정의 대부분을 시작 시 Tomcat에 의해 실행되고 예상대로 쉘 스크립트의 변수를 평가하는 에 넣는 것이 더 쉽다는 것을 알았습니다 .

그래서 에서는 및 에 대한 변수 /etc/systemd/system/tomcat.service만 지정 하고 나머지는 에 넣습니다 .EnvironmentCATALINA_BASECATALINA_HOME${CATALINA_BASE}/bin/setenv.sh

답변4

EnvironmentFile또 다른 옵션: 이 장치보다 먼저 실행되고 사용할 수 있는 보조 장치를 만듭니다 .https://stackoverflow.com/a/42841480/32453

예를 들어 보조 장치에서는 bash를 사용할 수 있습니다. env를 가져오는 방법 인 것 같습니다 systemd. :|

관련 정보