Windows下PM2托管Node.js Express应用 登出RDP后进程终止问题求助
Markdown 排版规范
- 标题使用井号(
#)开头标注层级 - 列表项使用短横线(
-)开头编写 - 需要重点强调的文本使用星号(
*)包裹 - 代码、命令类内容使用反引号(
`)包裹 - 引用类内容使用大于号(
>)开头标注 - 链接格式为
[链接文本](链接地址) - 图片格式为
[图片替代文本](图片地址)
Windows 环境PM2 托管应用随RDP登出停止的解决方案
核心原因
- 默认启动的PM2守护进程完全关联当前登录用户的会话上下文,RDP登出时Windows会强制回收该用户会话下的所有进程资源,这和
PM2_HOME路径设置、应用内的信号捕获逻辑无直接关联 - 常规安装
pm2-windows-service时如果未指定独立运行身份、未同步系统级环境变量,生成的Windows服务仍会继承原登录用户的会话权限,无法脱离用户会话独立运行
操作步骤
- 清理旧配置残留
以当前用户权限执行命令,杀掉所有运行中的PM2进程:pm2 kill
手动删除当前用户目录下旧的.pm2配置文件夹,避免旧配置干扰新部署 - 配置系统级
PM2_HOME环境变量
手动创建独立的非用户专属目录,比如C:\pm2\home
打开系统环境变量配置面板,新增系统级环境变量(非用户级):
变量名:PM2_HOME
变量值:C:\pm2\home
配置完成后重启服务器,确保环境变量对所有系统服务生效 - 重新部署PM2应用
打开管理员权限的命令提示符,执行应用启动命令:pm2 start app.js --watch
执行配置保存命令,将当前应用列表写入系统级的PM2配置文件:pm2 save - 配置独立运行的Windows服务
先卸载之前安装的旧服务:pm2-service-uninstall
重新安装服务,指定系统内置的SYSTEM账号作为运行身份:pm2-service-install -n PM2-Runtime -u SYSTEM
避坑提醒
- 不需要在应用内捕获
SIGINT、SIGTERM等退出信号阻止进程关闭,Windows服务管理时会通过系统机制通知PM2守护进程完成平滑重启,强行捕获信号反而会导致服务检测到进程僵死,强制终止应用 - 不要将
PM2_HOME配置在用户专属目录(比如用户挂载的网络盘、系统盘的用户文件夹路径下),系统级服务没有权限读取这类路径下的配置 - 服务安装全流程必须使用管理员权限操作,否则生成的服务会被注册为用户级服务,仍会随用户登出被回收
验证方法
打开Windows服务管理器,找到新建的PM2-Runtime服务,将启动类型设置为“自动(延迟启动)”
完全断开RDP会话,等待1分钟后重新登录服务器,执行pm2 list确认应用仍处于运行状态
内容的提问来源于stack exchange,提问作者user11323942
相关产品推荐
相关产品推荐

