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 的方法。 :|

相關內容