我正在迁移自暴发户到系统。我在进行转换时遇到了一些麻烦环境文件指示。我无法得到这个环境文件上班:
########################################################
# 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
手册页:
变量扩展不在字符串内部执行,但是可以进行说明符扩展。 $ 字符没有特殊含义。
因此你有两个选择。
手动展开所有变量。意思是使用
CATALINA_BASE=/d01/tomcat/prod/xyz/1
。使用 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_BASE
CATALINA_HOME
${CATALINA_BASE}/bin/setenv.sh
答案4
另一种选择:让一个辅助单元在此单元之前运行并创建一个EnvironmentFile
它可以使用的单元:https://stackoverflow.com/a/42841480/32453
例如,辅助单元可以使用 bash。似乎是systemd
导入 env 的方法。 :|