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

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

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

因此你有两个选择。

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

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

答案2

我需要写一份长而难读的声明吗?

以反斜杠结尾的行将与下一行连接,从而允许多行变量定义。

答案3

在 Tomcat 的特定情况下(如在这个问题中),我发现将大部分设置放在 中会更容易bin/setenv.sh,它由 Tomcat 在启动时执行,并按预期评估 shell 脚本中的变量。

因此,/etc/systemd/system/tomcat.service我只指定和Environment的变量,然后将其余内容放入。CATALINA_BASECATALINA_HOME${CATALINA_BASE}/bin/setenv.sh

答案4

另一种选择:让一个辅助单元在此单元之前运行并创建一个EnvironmentFile它可以使用的单元:https://stackoverflow.com/a/42841480/32453

例如,辅助单元可以使用 bash。似乎是systemd导入 env 的方法。 :|

相关内容