systemd: 環境変数のデフォルト値

systemd: 環境変数のデフォルト値

私はいくつかのOpenRC初期化スクリプトをsystemdに移行したいのですが、これはsystemdの環境変数の処理に関する一般的な問題だと思います。

元のOpenRCファイル

/etc/conf.d/fooserviceたとえば、コンテンツを含むファイルがあります。

#FOO変数の値
#この行のコメントを外すことでデフォルト値を上書きできます
# FOO=値1

#BAR変数の値
バー=値2

元の起動スクリプトには次の/etc/init.d/fooserviceものがあります。

FOO=${FOO:-default_foo_value}
バー=${BAR:-default_bar_value}

だから結果$FOO==default_foo_value$BAR==value2

移行されたシステムファイル

/usr/lib/systemd/system/fooservice.serviceこれで、以下を含むsystemdサービスファイルがあります。

[提供する]
環境ファイル =/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

$FOOしかし、初期化できない問題がありますdefault_foo_value

環境ファイルに値がない場合は、systemdにデフォルト値を使用するように指示する方法はありますか?デフォルト値を持つ中間環境ファイルまたは複数のリンク環境ファイルを使用する方法はありますか?

解決策:

これは良い考えではありません。/etc/conf.d/fooserviceファイルは「シェルスクリプト」であり、systemdには「環境ファイル」が必要なため、互換性がない可能性があります。デフォルトの割り当てでは似ているようですが、同じではありません。

これに対してGentooが好む解決策は、他のファイルを使用するのではなく、すべてをサービスファイルとサービス設定ファイルに入れることですconf.d

有効だが優先されない解決策:

OpenRCサービスをsystemdほど高速に実行するには、この方法を使用してください。

/usr/lib/systemd/system/fooservice.service今含める

[提供する]
環境="FOO=default_foo_value"
環境="BAR=default_bar_value"
環境ファイル =/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

答え1

systemdはシェルではないため、環境ファイル内のシェル固有の置換はサポートされていません。形式は簡単KEY=VALUEで、空白行とコメントを含めることができます。

見積もりシステムの実行(5):

これらのファイルの設定は、Environment =を使用して作成した設定よりも優先されます。これらのファイルで同じ変数が2回設定されると、指定された順序でファイルが読み取られ、後の設定が以前の設定を上書きします。

したがって、次のいずれかの方法で操作を完了できます。

  • 複数のEnvironmentFile=ディレクティブを使用する(通常の順序で互いに上書きされます)

  • Environment=サービスファイルでデフォルト値を指定するために使用します(すべての値がEnvironmentFile=それを上書きします)。

関連情報