如何在不重新启动进程的情况下更新进程中的 ENV 变量(NodeJS)?

问题描述 投票:0回答:7

我有一个在 NodeJS 上运行的服务器。有没有办法在不重启服务器的情况下更新进程中的环境变量?

我想做的是:

  1. 启动我的服务器
    npm start
  2. type something into the console to update ENV variable
  3. 服务器使用新环境变量重新启动
node.js shell terminal process restart
7个回答
5
投票

从编程的角度来看,您应该能够更新传递到正在运行的进程中的

process.env
变量。

例如运行:

cmd_line$: MY_VALUE=some_val node ./index.js

带有代码:

console.log(process.env.MY_VALUE)
process.env.MY_VALUE = 'some other value'
console.log(process.env.MY_VALUE)
process.env.MY_VALUE = 4
console.log(process.env.MY_VALUE)

终端输出:

some_val
some other value
4

从服务器管理的角度来看,对于已经运行的应用程序,我不知道答案。


5
投票

可以调试 Node.js 进程并更改全局变量:

在 *nix 上,即使进程未在调试模式下启动,也可以启用调试。在 Windows 上,只能调试以

node --inspect
启动的进程。 本文详细解释了这两种可能性。

显然,只有在始终直接使用环境变量时才有效,如

process.env.FOO

如果最初使用它们的值,稍后更改

process.env.FOO
可能不会产生任何影响:

const FOO = process.env.FOO;
...
console.log(FOO); // it doesn't matter whether process.env.FOO was changed at this point

3
投票

如果您对环境变量进行更改,只有当您通过系统的主属性对话框进行更改时,这些变量才会立即发生,该对话框将转到我的计算机 -> 高级属性 -> 环境变量。

任何已经运行的程序都不会看到更改,除非我们在代码中显式处理它。

其背后的逻辑是,有一个代理发送广播 WM_SETTINGCHANGE 消息并对所有应用程序进行更改,以便通知该更改。


0
投票

这里有一个关于如何在 mac OS 中设置环境变量的很好的解释。此外,正如其他人已经回答的那样,您可以使用

process.env.ANY_VARIABLE = 'some value'
设置它们。


0
投票

我正在尝试找到一个跨平台的答案(mac、linux、windows)

对于 Mac,我发现的解决方法是使用

const shell = require("shelljs");  

console.log(shell.exec('launchctl getenv TEST'));

仅当您使用

launchctl setenv TEST blahblah

设置环境变量(例如在其他终端选项卡中)时才有效

0
投票

您可以尝试使用这个 JavaScript 小库来更新环境变量,而无需重新启动节点服务器:

https://www.npmjs.com/package/runtime-node-refresh

希望这有帮助。


0
投票

process.env.WHATEVER = ...
更新一个对象,如果你
console.log(process.env.WHATEVER)
,你将记录该值,并且它与实际的环境无关。您的 current 程序的其他部分现在可以访问
process.env.WHATEVER
,因为它是 JavaScript 程序内部全局变量上的路径。

但是!如果您想执行子程序并期望它们与当前进程具有相同的

env
,则需要显式地将您的env传递给exec/spawn命令。 F.e.:

exec('echo $WHATEVER', {env: process.env})

与spawn等类似

如果您不将

env
传递给子进程创建命令,它们将不会自动从父进程继承 env。

您还可以将

env
设置为与父级完全不同的内容。

© www.soinside.com 2019 - 2024. All rights reserved.