【问题标题】:How do I set Linux environment variables so that pm2 can see them for node.js apps?如何设置 Linux 环境变量以便 pm2 可以在 node.js 应用程序中看到它们?
【发布时间】:2016-04-26 04:06:10
【问题描述】:

当我使用 node server.js 在我的 Ubuntu Linux 服务器上运行我的 nodejs 应用程序时,它可以正常工作,并使用 process.env.db 输出环境变量 $db 的值。

但是,应用程序在运行sudo pm2 start server.js 时中断,将环境变量视为undefined

我尝试在以下文件中添加变量:

  • 等/环境:db="hello"
  • ~/.ssh/环境:db="hello"
  • ~/.bashrc : export db="hello"

我还重新启动并运行 source ~/.bashrc 以确保变量可用。

我想我已经尝试了这里提到的一切,我不知道还能做什么:

【问题讨论】:

    标签: linux node.js ubuntu pm2


    【解决方案1】:

    请注意,source ~/.bashrc 您正在为当前用户加载变量。但是,当您说 sudo ... 时,您正在与用户 root 一起运行,所以这不会改变。

    你可以做的是将sudo-E一起使用:

    sudo -E pm2 start server.js
    

    来自man sudo

    -E, --preserve-env
                 Indicates to the security policy that the user wishes to reserve their
                 existing environment variables.  The security policy may eturn an error
                 if the user does not have permission to preserve the environment.
    

    【讨论】:

    • 谢谢,这行得通。但我不明白为什么,在 etc/environment 中肯定有变量意味着 root 用户可以看到它?我认为问题恰恰相反——我的用户看不到它,因此我不得不将变量添加到 ~/ 文件以及 etc/environment。
    • 这可能与您在/etc/environment 中说db="hello" 的事实有关。如果您不使用export 定义它,则该变量对子流程不可用。在该文件中说 export db="hello" 应该可以。
    • 我不这么认为,从这里:help.ubuntu.com/community/EnvironmentVariables - “它不是脚本文件,而是由赋值表达式组成,每行一个。”但无论如何,没关系,我现在知道如何让它工作了,谢谢。
    • /etc/environment 在登录/身份验证期间加载。修改时不自动设置。
    【解决方案2】:

    请参考本帖https://github.com/Unitech/pm2/issues/204

    好像你的环境变量被缓存了。

    【讨论】:

    • 按照建议,我尝试运行 sudo pm2 kill 来关闭整个进程,然后重新启动它,以获取新变量,但它仍然不起作用。我也重新启动了机器,所以我怀疑这是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2021-11-27
    • 2012-08-02
    • 2013-10-28
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多