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 つ作成する必要があるのか​​?

答え1

残念ながら、そのファイルは実際にはシェルスクリプトです。これまで、ほとんどのinitシステム/スクリプトは、シェルを使用して環境変数を提供するファイルを解釈していたため、それらでシェルの処理を行うことができました。しかし、Systemdはそうしません。環境ファイルは、スクリプトではなく、まさに環境ファイルです。これは、systemd.execマニュアルページ:

文字列内では変数の展開は行われませんが、指定子の展開は可能です。$ 文字には特別な意味はありません。

したがって、2 つの選択肢があります。

  1. すべての変数を手動で展開します。つまり、 を使用しますCATALINA_BASE=/d01/tomcat/prod/xyz/1

  2. シェルでファイルを評価します。
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

答え2

読みにくい長い文を 1 つ作成する必要がありますか?

いいえ

バックスラッシュで終わる行は次の行と連結され、複数行の変数定義が可能になります。

答え3

Tomcat の特定のケース (この質問のように) では、これらの設定のほとんどを に配置する方が簡単であることがわかりました。これはbin/setenv.sh、起動時に Tomcat によって実行され、シェル スクリプト内の変数を期待どおりに評価します。

したがって、 ではとの変数のみ/etc/systemd/system/tomcat.serviceを指定し、残りの内容を に配置します。EnvironmentCATALINA_BASECATALINA_HOME${CATALINA_BASE}/bin/setenv.sh

答え4

EnvironmentFile別のオプション: このユニットの前に実行され、使用できるものを作成するセカンダリ ユニットを用意します。https://stackoverflow.com/a/42841480/32453

セカンダリ ユニットでは、たとえば bash を使用できます。envsystemdをインポートする方法のようです。:|

関連情報