常规结束方法
-
Ctrl + C(推荐首选)
- 在运行Node程序的命令行窗口中按下
Ctrl + C
组合键 - 触发
SIGINT
信号,Node.js会执行process.on('SIGINT')
回调 - 示例:
$ node server.js ^C # 按下Ctrl+C后显示
- 在运行Node程序的命令行窗口中按下
-
代码主动退出
在脚本中调用系统函数:// 正常退出(退出码0) process.exit(); // 指定退出码(非0表示错误) process.exit(1);
强制终止无响应进程
-
Ctrl + \(Unix/Linux/macOS)
- 产生
SIGQUIT
信号生成内存转储 - 立即终止进程
- 产生
-
任务管理器(Windows)
- 步骤:
- 打开任务管理器(Ctrl+Shift+Esc)
- 在”进程”标签页找到
node.exe
- 右键选择”结束任务”
- 步骤:
进程管理工具操作
工具 | 命令 | 作用 |
---|---|---|
pm2 | pm2 stop <app_name> |
停止托管应用 |
forever | forever stop <uid> |
结束守护进程 |
systemd | sudo systemctl stop my-node-service |
停止系统服务 |
命令行终止指令
-
查找并终止进程
# 查找Node进程ID ps aux | grep node # 终止进程(Unix/Linux/macOS) kill -9 <PID> # 强制终止 kill -15 <PID> # 优雅终止 # Windows命令 taskkill /PID <PID> /F
优雅关闭最佳实践
在代码中实现资源回收:
// 捕获退出信号 process.on('SIGTERM', () => { console.log('收到终止信号'); // 关闭数据库连接 db.close(() => { console.log('数据库连接已释放'); process.exit(0); }); // 设置超时强制退出 setTimeout(() => process.exit(1), 5000); });
特殊场景处理
- 后台进程
- 用
nohup
启动时:先kill
主进程,再删除nohup.out
- 用
- Docker容器
docker stop my_container # 发送SIGTERM docker kill my_container # 强制终止
常见问题排查
- 进程无法退出:检查是否有未关闭的定时器(
setInterval
)或活跃连接 - 退出码含义:
0
=成功,1
=未捕获异常,130
=Ctrl+C退出 - 使用
lsof -i :<端口>
检查端口占用
操作原则:优先使用
Ctrl+C
或kill -15
允许程序清理资源,强制终止(kill -9
/taskkill /F
)仅作为最后手段,生产环境建议通过PM2等工具添加shutdown_hook
实现零停机更新。
通过规范化的退出流程,可避免文件损坏、数据丢失和内存泄漏问题,测试环境应模拟各种退出场景,确保关键业务逻辑实现完整的优雅关闭。
引用说明:本文方法参考Node.js官方文档Process Signal Events及Linux系统管理手册,进程信号处理遵循IEEE Std 1003.1(POSIX)标准。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6048.html