web-dev-qa-db-ja.com

systemd、EnvironmentFile、変数の再利用-どのように?

pstartからsystemdに移行しています。 EnvironmentFileディレクティブを使用して移行を行う際に少し問題があります。私はこれを取得できません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

pstartとは異なり、systemdではサポートされていません。 systemdはこのようなものをサポートしていますか、それとも1つの長く読みにくいステートメントを作成する必要がありますか?

6
Van

残念ながら、このファイルは実際にはシェルスクリプトです。これまで、ほとんどのinitシステム/スクリプトは、シェルを使用して環境変数を提供するファイルを解釈していたため、シェルでの作業を回避できました。ただし、Systemdはこれを行いません。環境ファイルは、実際にはスクリプトではなく環境ファイルです。これは systemd.exec manページ

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

したがって、2つのオプションがあります。

  1. すべての変数を手動で展開します。意味CATALINA_BASE=/d01/Tomcat/prod/xyz/1

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

8
Patrick

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

番号

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

2
sourcejedi

bashを使用して変数を拡張できます。

環境ファイル:

BLA=bla
BLABLA=${BLA}${BLA}

使用する bash -cコマンドを実行するには:

ExecStart=/usr/bin/bash -c 'echo ${BLA} .. ${BLABLA}'

出力:

bash[4771]: bla .. blabla
1
ctx

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

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

1
isapir

別のオプション:このユニットの前に実行し、使用可能なEnvironmentFileを作成するセカンダリユニットを用意する: https://stackoverflow.com/a/42841480/3245

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

0
rogerdpack