Node.js服务器在SSH终端disown并关闭会话后崩溃且CPU满载
Node进程disown后关闭SSH导致CPU100%的解决方案
问题核心原因
你遇到的问题本质是Node进程的标准输入/输出(stdin/stdout)未正确脱离终端。当你用disown -h仅移除HUP信号关联但未处理IO流时,终端关闭后,Node进程尝试读写已经失效的终端设备,触发无意义的忙等待(busy loop),直接占满CPU导致服务器锁死。
快速修复方法
方法1:启动时重定向IO到/dev/null
启动Node进程时,把标准输出和错误输出都定向到空设备,避免终端关闭后的IO异常:
node server.js > /dev/null 2>&1 & disown -h
> /dev/null:将标准输出(stdout)丢弃2>&1:将标准错误(stderr)重定向到标准输出,一起丢弃
方法2:用nohup替代disown
nohup会自动处理终端脱离和IO重定向,比手动disown更可靠:
nohup node server.js > /dev/null 2>&1 &
执行后直接关闭SSH即可,无需额外disown命令。默认输出会写入nohup.out,这里指定到/dev/null避免生成冗余日志文件。
方法3:使用专业进程管理工具(推荐长期服务)
对于生产环境的Node服务,强烈使用pm2这类进程管理器,彻底解决终端依赖问题,还能提供监控、自动重启、日志管理等实用功能:
- 安装pm2:
npm install -g pm2
- 启动服务:
pm2 start server.js
- 查看进程状态:
pm2 status
- 设置开机自启(可选):
pm2 startup
验证步骤
按照上述任一方法启动服务后,关闭SSH会话,访问站点并通过ps aux查看CPU占用,确认问题是否解决。
内容的提问来源于stack exchange,提问作者Joshua Brewster
相关产品推荐
相关产品推荐

