この質問は@FrustratedWithFormsDesigner comment に由来します。
Init.dスクリプト内で設定されたexport
環境変数を、同じinit.dスクリプト内で開始されたダウンストリームプロセスで使用できるようにするにはどうすればよいですか?
より詳細には、私はAmazon EC2インスタンスを使用しており、init.dスクリプトを使用してnode
。jsサーバーを制御します。このサーバーはnodemon
によって制御され、ファイルの変更を監視して再起動しますnode
必要に応じて。要するに、私のinit.dスクリプトはnodemon
を開始し、次にnode
を開始します。 init.dスクリプト内でexport
を使用して設定された環境変数は、nodemon
では使用できるようですが、node
では使用できません。これらの環境変数をnode
でも利用できるようにするにはどうすればよいですか?
現在、Amazon EC2インスタンスで使用できるのはinit.dだけなので、これはinit.dスクリプトでも可能です。それ以外の場合は、upstartまたはできればsystemdでも可能ですか?
FedoraやUbuntu 16.04など、systemdベースのLinuxディストリビューションに切り替えることをお勧めします。 systemd
は簡単に環境変数をプロセスに渡すことができます。また、失敗したプロセスの自動再起動や起動時の起動を処理できます。ロギングもsystemd`s journaldによってうまく処理されます。 systemdはOSディストリビューションの一部であるため、他に何かをインストールまたは実行するオーバーヘッドもありません。
ユニットファイルでsystemdを使用して2つの環境環境変数を設定する例を次に示します。
Environment="ONE=one" 'TWO=two two'
完全なドキュメントは here です。
Initシステムとプロセスマネージャーの両方が環境変数の受け渡しを処理したため、問題の一部は複雑さの1つでした。 systemdをinitシステムとプロセスマネージャーの両方として使用すると、複雑さの層が取り除かれます。
この回答 で提案されているように、systemdサービス自体でEnvironmentディレクティブを使用することに加えて、別のオプションはEnvironmentFileディレクティブです。
私はこの分野の専門家ではないことに注意してください(明らかに、私はこの質問の著者です)。 Fedora Wiki の能力を最大限に要約しただけです。私を自由に編集/修正してください。
改行で区切られた変数の割り当てを含むファイルを作成します。
# myservice.env
ENV1=value1
ENV2=value2
次に、サービスユニットファイルでEnvironmentFileディレクティブを使用します。
[Service]
...
EnvironmentFile=-/path/to/myservice.env
...
ユニットファイル内で、${ENV1}
および$ENV1
を使用して、myservice.env内で設定された変数を参照します。
EnvironmentFile=
行の "-"は、環境ファイルが存在しない場合にエラーメッセージが生成されないようにします。
AWS EC2のような仮想化環境では、/etc/environment
[Service]
...
EnvironmentFile=/etc/environment
...