环境:宝塔 Linux 面板 13.1.0,PM2 v7.1.0(Node v24.22.1),CentOS/Ubuntu 均可复现
复现步骤:
网站 → Node项目 → 新建 PM2 项目,"运行用户"选择 www;
项目停止后,点"启动"(或 PM2 监控页的启动);
ps aux 或 PM2 监控查看进程:以 root 运行;
同一项目点"保存配置"(不改任何内容):进程变为 www 运行。
根因(mod/project/nodejs/ 下代码):
pm2Mod.start_project()(pm2Mod.py:763-808)以 root 执行创建时缓存的启动脚本(ExecShell 未传 user 参数,pm2Mod.py:797),脚本硬编码 export HOME=/root(pm2Mod.py:748),整个启动过程不使用项目配置中的 run_user;进程身份只取决于磁盘 ecosystem 文件残留的 uid/gid。
PM2 监控页启动走 pm2Mod.start()(pm2Mod.py:367-387),执行 pm2 start <进程名>,PM2 不会重读 ecosystem,沿用旧记录的 uid。
而"保存配置"(comMod.modify_project → structure_ecosystem_for_config_body,pm2Mod.py:629-630)会用表单 run_user 重写 uid/gid 并 delete+start 重新注册,所以表现正常。
旧版模型 nodejsModel.start_project 是 ExecShell(..., user=run_user),新版 pm2Mod 没有等价兜底,属回归。
修复建议:
pm2Mod.start_project 启动前用 DB 中的 run_user 重新注入/校验 ecosystem 的 uid/gid,与保存配置路径行为对齐;
对已存在的 pm2 记录,启动改为 delete + start(或等效方式)确保 uid 生效,而不是 pm2 start <name> 直接恢复旧记录;
顺带修复 base.py:1065 replace_or_add_field:uid/gid 注入应覆盖 apps 数组中的每个 app,并避免匹配到注释文本。
影响:
生产环境 Node 应用以 root 运行,权限过大,存在安全风险;且同一面板两个"启动"入口行为不一致,用户无法感知。
|
|