You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pm2 start 无法重新加载环境变量的问题求助

问题原因及解决方案

核心原因

pm2 管理进程时,若目标进程已存在,直接执行 pm2 start 或 pm2 restart 并不会彻底销毁旧进程并创建新进程——旧进程的环境变量是启动时加载的,运行过程中不会自动读取系统新配置的环境变量,所以新的 AUTH_APPLE_ID 和 AUTH_APPLE_SECRET 无法被加载。

另外,你在 deploy.sh 里执行的 source ~/.profile 只是把环境变量加载到当前脚本的 shell 上下文,但如果 pm2 管理的旧进程还在运行,它不会继承这个新的 shell 环境。

解决方案

1. 彻底销毁旧进程再启动

修改 deploy.sh 中的命令,先删除旧进程再启动新进程,确保新进程继承脚本中加载的最新环境变量:

source ~/.profile
nvm use
pm2 delete splitfire-web || true  # 即使进程不存在也不中断脚本
pm2 start "pnpm start-splitfire-web" --name splitfire-web

|| true 用于避免进程不存在时脚本报错中断,--name 明确指定进程名,方便后续管理。

2. 使用 pm2 配置文件管理环境变量(更推荐)

创建 ecosystem.config.js 配置文件,把环境变量和进程配置统一管理,避免依赖系统 profile:

module.exports = {
  apps: [
    {
      name: "splitfire-web",
      script: "pnpm",
      args: "start-splitfire-web",
      env: {
        AUTH_APPLE_ID: process.env.AUTH_APPLE_ID,
        AUTH_APPLE_SECRET: process.env.AUTH_APPLE_SECRET,
        // 其他应用所需环境变量
      }
    }
  ]
};

然后修改 deploy.sh 的命令:

source ~/.profile
nvm use
pm2 reload ecosystem.config.js  # 进程不存在时会自动启动

这种方式更可靠,pm2 每次启动/重载都会读取配置文件中的环境变量,无需担心旧进程上下文的问题。

3. 验证环境变量是否正确加载

可以在 deploy.sh 的 source ~/.profile 之后添加验证命令,确保变量已被加载到当前 shell:

echo "AUTH_APPLE_ID: $AUTH_APPLE_ID"
echo "AUTH_APPLE_SECRET: $AUTH_APPLE_SECRET"

如果输出为空,说明 ~/.profile 中的环境变量配置有问题,要确保是 export AUTH_APPLE_ID=xxx 格式(必须加 export 才能让子进程继承变量)。

内容的提问来源于stack exchange,提问作者Seto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:12:13