AWS EC2 Windows实例断开会话后NodeJS进程终止问题求助
解决Windows Server 2012 R2断开远程后NodeJS进程停止的问题
这个问题我之前维护Windows服务器上的Node服务时也碰到过,核心原因是Windows远程桌面会话断开后,用户会话会被自动注销,导致运行在该会话下的Node进程跟着终止。下面给你几个亲测有效的解决方案,按推荐程度排序:
1. 将Node进程注册为Windows服务(最稳定推荐)
把Node程序做成系统服务是最可靠的方式,服务在系统账户下运行,完全不受用户会话的影响,开机自动启动,断开远程也不会停止。我常用nssm(Non-Sucking Service Manager)来做这个,比Windows自带的sc命令简单太多:
- 下载nssm后解压到服务器上的固定路径,比如
C:\nssm - 以管理员身份打开命令提示符,切换到nssm的对应位数目录:
cd C:\nssm\win64(根据系统位数选32或64位) - 运行命令安装服务:
nssm install NodeMyService(NodeMyService是你自定义的服务名称) - 在弹出的nssm配置窗口里,做以下设置:
- Application标签:
- Path:选择你的node.exe完整路径(比如
C:\Program Files\nodejs\node.exe) - Arguments:填写你的Node项目入口文件的完整路径(比如
C:\node-app\server.js) - Working Directory:填写项目的根目录(比如
C:\node-app)
- Path:选择你的node.exe完整路径(比如
- Service标签:
- Startup type:选择
Automatic(开机自动启动)
- Startup type:选择
- Application标签:
- 点击
Install Service完成安装,然后可以在服务管理器里找到这个服务,右键启动它。之后不管你是否连接远程,服务都会持续运行。
2. 使用tscon命令分离会话(临时场景适用)
如果只是临时需要保持进程运行,不想改服务,可以用tscon命令把当前会话转移到控制台,这样断开远程时不会注销会话:
- 登录服务器后,打开命令提示符,运行
query session,找到你当前会话的ID(比如输出里的rdp-tcp#0对应的ID是2) - 运行命令:
tscon 2 /dest:console(把2换成你的会话ID) - 执行完后远程桌面会自动断开,但你的会话并没有被注销,Node进程会继续在后台运行。下次连接时,直接登录就能回到之前的会话状态。
3. 修改组策略禁用会话自动注销(不推荐长期用)
如果不想用服务或手动执行命令,可以调整Windows的会话超时设置,防止断开后自动注销:
- 运行
gpedit.msc打开组策略编辑器 - 依次展开:计算机配置 -> 管理模板 -> Windows组件 -> 远程桌面服务 -> 远程桌面会话主机 -> 会话时间限制
- 找到以下两个设置,都改成已禁用(或者设置一个极长的超时时间):
- 设置空闲远程桌面服务会话的时间限制
- 设置断开的会话的时间限制
- 运行
gpupdate /force更新组策略,之后重启服务器生效。
注意:这个方法会导致闲置会话一直占用系统资源,长期使用可能会有性能问题,所以只适合临时应急。
内容的提问来源于stack exchange,提问作者I'l Follio
相关产品推荐
相关产品推荐

