Node.js 进程、子进程与 Cluster 实战教程
本系列面向刚开始学习 Node.js 后端的开发者,以 Node.js 22+、TypeScript、CommonJS 和 ts-node 为基础,重点解决日常工程问题:运行 Bash/Python/R、读取标准输出、判断进程是否成功、取消超时任务、使用 Cluster 扩展 Express,以及在 PM2 中正确部署。
学习路线
- 学习路线与贯穿项目
- 操作系统进程与 Node.js 进程
process属性与运行环境argv、env、cwd与退出码- stdin、stdout、stderr 与 stdio
- Bash 管道、重定向与退出状态
- Process 事件、Signal 与优雅退出
child_process工作原理spawn()实战exec()、execFile()与fork()- 子进程 stdio 配置
- 启动、错误、结束与成功
- 超时、Abort 与子进程清理
- 运行 Bash、Python、R 与第三方工具
- IPC 与进程间通信
- Worker、child_process、Cluster 与 Worker Threads
- Cluster 工作原理
- Cluster + Express 实战
- 重复监听、定时任务与资源所有权
- 命令执行安全与隔离
- PM2、Nginx、Cluster 与部署
- 可观测性、测试与排错
- 最终综合项目
- API Cheatsheet
贯穿场景
前端创建分析任务
→ Express 校验并持久化
→ 后台 Worker 领取任务
→ spawn() 启动 Python/R/Bash
→ stdout 输出机器结果/进度
→ stderr 输出诊断
→ close 事件确认 stdio 已关闭
→ 根据退出码和结果协议更新任务
→ Cluster/PM2 管理多个服务进程
使用约定
- 示例使用
import/export,由 TypeScript 编译为 CommonJS。 - 生产中先执行
tsc,再让fork()/PM2 运行dist/*.js。 - Shell 命令以 Ubuntu Bash 为主,Windows/PowerShell 差异会单独说明。
- 示例中的外部输入始终视为不可信,不拼接 Shell 命令。
- 每章练习先验证正常路径,再故意测试命令不存在、非零退出、超时、Signal 和大输出。
必须记住
stderr 有内容不等于失败
exit 发生不等于 stdio 已全部关闭
kill() 返回 true 不等于进程已经退出
Worker 是角色名称,不是一种固定 API
Cluster Worker 是独立 Node.js 进程,不共享全局变量
每个 Cluster Worker 都会执行入口文件,外部副作用可能重复
PM2 多实例与代码 Cluster 通常只选择一层扩容