systemd,EnvironmentFile,重用变量 - 如何?

Van*_*Van 6 environment-variables systemd

我正在从新贵迁移到systemd。我在使用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
Run Code Online (Sandbox Code Playgroud)

看起来我在这种类型的语句中重用了一个变量:

JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC
Run Code Online (Sandbox Code Playgroud)

systemd不像upstart那样支持它。systemd是否支持这样的东西,还是我需要做一个长而难以阅读的声明?

phe*_*mer 13

不幸的是,您拥有的文件实际上是一个 shell 脚本。过去,大多数 init 系统/脚本都解释了使用 shell 提供环境变量的文件,因此您可以在其中执行 shell 操作。然而,Systemd 不会这样做。环境文件是真正的环境文件,而不是脚本。这记录在systemd.exec手册页中

字符串内部不进行变量扩展,但可以进行说明符扩展。$ 字符没有特殊含义。

因此,您有 2 个选择。

  1. 手动展开所有变量。意义使用CATALINA_BASE=/d01/tomcat/prod/xyz/1

  2. 使用 shell 评估文件:
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

  • @sourcejedi 不,没有错。参见 `-a` 参数。`man bash`:“自动标记为导出到后续命令的环境而修改或创建的变量和函数。” (3认同)