web-dev-qa-db-ja.com

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

OpenRC initスクリプトをsystemdに移行したいのですが、systemdで処理する環境変数の一般的な問題だと思います。

元のOpenRCファイル

ファイルがあります。 /etc/conf.d/fooserviceと内容

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

元の起動スクリプト/etc/init.d/fooserviceでは、

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

結果は$FOO==default_foo_value$BAR==value2でした

移行したsystemdファイル

これでsystemdサービスファイル/usr/lib/systemd/system/fooservice.serviceができました。

 [サービス] 
 EnvironmentFile =/etc/conf.d/fooservice 
 ExecStart =/usr/bin/fooservice $ FOO $ BAR 

ただし、$FOOdefault_foo_valueに初期化されていないという問題があります。

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

解決策:

これは良い方法ではありません。 /etc/conf.d/fooserviceファイルは「シェルスクリプト」であり、systemdは「環境ファイル」を想定しているため、互換性がない可能性があります。基本的な値の割り当てでは、似ているように見えますが、同じではありません。

Gentooによるこれの好ましい解決策は、サービスファイルとサービスの構成ファイルにすべてを入れて、追加のconf.dファイルを使用しないことです。

機能しますが、推奨されるソリューションではありません:

OpenRCサービスをsystemdとして実行するには、これを高速なハックとしてのみ使用してください。

/usr/lib/systemd/system/fooservice.serviceに含まれるようになりました

 [サービス] 
 Environment = "FOO = default_foo_value" 
 Environment = "BAR = default_bar_value" 
 EnvironmentFile =/etc/conf.d/fooservice 
 ExecStart =/usr/bin/fooservice $ FOO $ BAR 
5
j123b567

systemdはシェルではないため、環境ファイルでのシェル固有の置換はサポートされていません。それらの形式は単にKEY=VALUEであり、間に空白行とコメントが入る可能性があります。

引用するには systemd.exec(5)

これらのファイルの設定は、Environment =で行われた設定を上書きします。これらのファイルから同じ変数が2回設定されている場合、ファイルは指定された順序で読み取られ、後の設定が前の設定を上書きします。

したがって、次のいずれかの方法でタスクを実行できます。

  • 複数のEnvironmentFile=ディレクティブを使用する(仕様の順序で相互にオーバーライドする)

  • サービスファイルでEnvironment=を使用してデフォルト値を指定する(EnvironmentFile=はそれをオーバーライドします)

6
intelfx