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=
より独立し、エレガントで、あなたのユースケースに適していると思います。