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
相关产品推荐
相关产品推荐

