特定のサービスの環境変数をエクスポートできますか?

特定のサービスの環境変数をエクスポートできますか?

2つのサービスがあるとしましょう。これは、システム(Ubuntu 16.04.3)の起動時に自動的に起動される2つのプロセスです。

サービス文書:

[Unit]
Description=service 1
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd
ExecReload=someCmd
KillMode=process
Restart=on-failure
Type=simple

他のサービスファイル:

[Unit]
Description=service 2
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd2
ExecReload=someCmd2
KillMode=process
Restart=on-failure
Type=simple

どちらのサービスも同じ環境変数の一部を必要とします。

someCmd両方のサービスのsは、同じenv変数を設定する2つの異なるbashスクリプトなので、現在私の解決策は悪いです。

両方のサービスが共有できるように、どこかにいくつかの環境変数を設定できるかどうか疑問に思います。つまり、環境変数を2回ではなく1回だけ設定したいのです。

/etc/profileでこれらの環境変数をエクスポートしようとしましたが、/etc/rc.local動作しません。これは、システムが最初に2つのサービスを実行してから、システムがそれを読むため/etc/profileだと思います。/etc/rc.local

複数のサービスファイルにいくつかの環境変数を設定する方法はありますか?一部の環境変数を取得するためにサービスファイルで設定できることはわかっていますが、EnvironmentFile=XXX各サービスに複数回設定する必要があるため、これは気に入らない。EnvironmentFile=XXX

答え1

使用するEnvironmentFile=方法です。

何度も設定する必要があることを理解していません。これらの変数が必要な各サービスで一度だけ設定する必要があります。

サービス1:

[Unit]
Description=service 1

[Service]
ExecStart=someCmd
EnvironmentFile=/path/to/common.env
...

サービス2:

[Unit]
Description=service 2

[Service]
ExecStart=someCmd2
EnvironmentFile=/path/to/common.env
...

すべてのVAR=VALUE設定をファイルに保存します/path/to/common.env

環境ファイルの構文はシェルスクリプトの構文と互換性があるため、自分の環境でも取得できます。.bash_profile

# ~/.bash_profile
if [ -f /path/to/common.env ]; then
    . /path/to/common.env
fi

代替方法は、PID 1でグローバル環境変数を有効またはsystemctl set-environment設定することです。systemctl import-environment(文書参照ここ.)

特定のサービスからこれらの変数をエクスポートする必要があるかもしれませんが、PassEnvironment=その場合は変数名だけをリストするだけです。

私はこれが最善の解決策だとは思わない。EnvironmentFile=より独立し、エレガントで、あなたのユースケースに適していると思います。

関連情報