web-dev-qa-db-ja.com

init.dスクリプト内で開始されたダウンストリームプロセスで環境変数を使用できるようにする

この質問は@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でも可能ですか?

5
Marc A

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システムとプロセスマネージャーの両方として使用すると、複雑さの層が取り除かれます。

4
Mark Stosberg

この回答 で提案されているように、systemdサービス自体でEnvironmentディレクティブを使用することに加えて、別のオプションはEnvironmentFileディレクティブです。

私はこの分野の専門家ではないことに注意してください(明らかに、私はこの質問の著者です)。 Fedora Wiki の能力を最大限に要約しただけです。私を自由に編集/修正してください。

EnvironmentFileディレクティブ

改行で区切られた変数の割り当てを含むファイルを作成します。

# myservice.env
ENV1=value1
ENV2=value2

次に、サービスユニットファイルでEnvironmentFileディレクティブを使用します。

[Service]
...
EnvironmentFile=-/path/to/myservice.env
...

ユニットファイル内で、${ENV1}および$ENV1を使用して、myservice.env内で設定された変数を参照します。

EnvironmentFile=行の "-"は、環境ファイルが存在しない場合にエラーメッセージが生成されないようにします。

4
Marc A

AWS EC2のような仮想化環境では、/etc/environment

[Service]
...
EnvironmentFile=/etc/environment
...
0
kixorz