我正在遷移自暴發戶到系統。我在進行轉換時遇到了一些麻煩環境文件指示。我無法得到這個環境文件上班:
########################################################
# 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 的方法。 :|