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
ただし、$FOO
がdefault_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
systemdはシェルではないため、環境ファイルでのシェル固有の置換はサポートされていません。それらの形式は単にKEY=VALUE
であり、間に空白行とコメントが入る可能性があります。
引用するには systemd.exec(5) :
これらのファイルの設定は、Environment =で行われた設定を上書きします。これらのファイルから同じ変数が2回設定されている場合、ファイルは指定された順序で読み取られ、後の設定が前の設定を上書きします。
したがって、次のいずれかの方法でタスクを実行できます。
複数のEnvironmentFile=
ディレクティブを使用する(仕様の順序で相互にオーバーライドする)
サービスファイルでEnvironment=
を使用してデフォルト値を指定する(EnvironmentFile=
はそれをオーバーライドします)