环境文件指令

环境文件指令

这个问题源于@FrusteratedWithFormsDesigner评论

如何使exportinit.d 脚本中设置的环境变量可供在同一 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 来实现?

答案1

我建议切换到基于 systemd 的 Linux 发行版,例如 Fedora 或 Ubuntu 16.04。systemd可以轻松地将环境变量传递给您的进程,并且它可以处理自动重新启动失败的进程以及在启动时启动它。 systemd 的日志也可以很好地处理日志记录。也没有安装或运行其他任何东西的开销,因为 systemd 是操作系统发行版的一部分。

以下是在单元文件中使用 systemd 设置两个环境变量的示例:

Environment="ONE=one" 'TWO=two two'

完整的文档是这里

您的问题部分是复杂性之一,因为初始化系统和进程管理器都处理传递环境变量。使用 systemd 作为初始化系统和进程管理器,消除了一层复杂性。

答案2

除了按照建议在 systemd 服务本身中使用环境指令之外这个答案,另一个选项是 EnvironmentFile 指令。

请注意,我不是这个领域的专家(显然,我是这个问题的作者);我只是尽我所能总结一下费多拉维基。请随意编辑/纠正我。

环境文件指令

创建一个包含换行符分隔的变量赋值的文件:

# myservice.env
ENV1=value1
ENV2=value2

然后,在您的服务单元文件中,使用 EnvironmentFile 指令:

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

在您的单元文件中,使用${ENV1}$ENV1来引用其中设置的变量myservice.env

该行中的“-”EnvironmentFile=确保如果环境文件不存在,则不会生成错误消息。

答案3

在 AWS EC2 等虚拟化环境中,您可能需要利用/etc/environment

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

相关内容