菜单

进程管理

相关源文件

目的与范围

本文详细介绍了 Nodemon 的进程管理子系统,该系统处理子进程从生成到终止的生命周期。它涵盖了 Nodemon 如何启动、重启和终止应用程序进程,管理进程间通信,以及处理平台特定的考量。有关如何检测文件更改以触发这些进程操作的信息,请参阅文件监控系统

概述

Nodemon 的进程管理负责将您的 Node.js 应用程序作为子进程执行并管理其生命周期。当检测到文件更改时,此子系统会处理终止现有进程并使用更新后的代码生成新进程。

来源: lib/monitor/run.js22-320 lib/monitor/run.js440-486

进程执行方法

Nodemon 根据运行的应用程序使用不同的 Node.js 子进程方法

来源: lib/monitor/run.js114-145

fork 与 spawn 的选择

Nodemon 根据以下条件选择使用 fork() 还是 spawn()

方法条件优点
fork()- 不使用 spawn 选项
- 不在 node_modules/.bin 路径中
- 没有 Node 执行参数
- 不使用 inspector
- 可执行文件是 'node'
- Node 版本 > 4
- 更好的子进程处理
- 更干净的进程清理
- 支持 IPC 通道
spawn()- 任何其他条件- 适用于非 Node 可执行文件
- 更灵活的进程控制

来源: lib/monitor/run.js116-123 lib/monitor/run.js124-145

进程生命周期

进程启动

当 Nodemon 启动一个进程时,它会

  1. 准备环境和 stdio 配置
  2. 决定是 fork 还是 spawn 进程
  3. 为子进程事件设置事件监听器
  4. 当进程运行时发出“start”事件

来源: lib/monitor/run.js22-145 lib/monitor/run.js147-178

进程重启

当文件更改时,Nodemon 会重启进程

  1. 事件总线发出“restart”事件
  2. 使用配置的信号终止正在运行的进程
  3. 进程退出后,生成一个新进程

来源: lib/monitor/run.js534-538 lib/monitor/run.js440-486

进程终止

Nodemon 根据退出条件以不同的方式处理进程终止

退出条件行为
干净退出 (代码 0)等待文件更改后重启
更改后被终止立即使用新代码重启
应用程序崩溃根据配置等待文件更改或退出
SIGINT/SIGTERM清理并退出 nodemon

来源: lib/monitor/run.js190-270

跨平台进程管理

Nodemon 在不同操作系统上以不同的方式处理进程管理

来源: lib/monitor/run.js338-438

Windows 特定处理

在 Windows 上

  • 使用 cmd 而非 sh 来生成进程
  • 设置 windowsVerbatimArgumentswindowsHide 选项
  • 使用 taskkill 进行强制终止
  • 对路径规范化有特殊处理

来源: 78-97 后缀省略lib/monitor/run.js344-407

Unix 特定处理

在类 Unix 系统上

  • 使用 psTree 查找并终止所有子进程
  • 向主进程及其后代发送 SIGUSR2 等信号
  • 按特定顺序处理终止(先子进程,后主进程)

来源: 后缀省略lib/monitor/run.js409-436

进程输入/输出管理

Nodemon 管理父子进程之间的标准 I/O 流

来源: 后缀省略lib/monitor/run.js51-59 后缀省略lib/monitor/run.js147-166 后缀省略lib/monitor/run.js284-314

Stdio 配置

Nodemon 根据选项配置 stdio 通道

选项配置效果
默认['pipe', 'pipe', 'pipe']所有流通过 nodemon 管道传输
stdout: true['pipe', process.stdout, process.stderr]直接透传 stdout/stderr
stdin: false[process.stdin, process.stdout, process.stderr]不处理 stdin

当 fork 进程时,一个额外的 IPC 通道被添加到 stdio 数组中。

来源: 后缀省略lib/monitor/run.js51-59 后缀省略lib/monitor/run.js133-134

流管道

Nodemon 对子进程流进行管道传输

  1. 如果需要,stdout 和 stderr 通过事件总线进行管道传输
  2. 当启用 stdin 时,父进程的 stdin 会管道传输到子进程
  3. 进程退出时,stdin 管道断开连接

来源: 后缀省略lib/monitor/run.js147-166 后缀省略lib/monitor/run.js284-314

信号处理

Nodemon 具有强大的信号处理系统

来源: 后缀省略lib/monitor/run.js490-532 后缀省略lib/monitor/run.js534-538 后缀省略lib/monitor/run.js549-560

进程信号

Nodemon 处理各种信号

信号默认用途Nodemon 处理方式
SIGUSR2默认重启信号终止并重启应用程序
SIGINT用户中断清理并退出 nodemon
SIGTERM终止请求清理并退出 nodemon

默认重启信号可在 nodemon 配置中设置。

来源: 后缀省略lib/monitor/run.js549-560 后缀省略lib/monitor/run.js222-270

错误处理

Nodemon 的进程管理包括强大的错误处理功能

  1. 子进程错误通过事件总线捕获并发出
  2. 对常见错误(如 ENOENT,可执行文件未找到)进行特殊处理
  3. 退出代码 2 得到特殊处理,因为它可能表示语法错误
  4. 应用程序崩溃可以根据配置等待更改或退出 nodemon

来源: 后缀省略lib/monitor/run.js179-188 后缀省略lib/monitor/run.js195-221 后缀省略lib/monitor/run.js250-269

详细实现

进程管理功能主要在以下文件中实现

  1. lib/monitor/run.js - 进程生成和生命周期管理的主要实现
  2. lib/spawn.js - 用于生成进程的实用模块(用于命令执行)

核心功能是

功能目的位置
run()启动子进程的主函数 后缀省略lib/monitor/run.js22-320
kill()终止进程的内部函数 后缀省略lib/monitor/run.js338-438
run.kill()用于终止并可选地重启的公共 API 后缀省略lib/monitor/run.js440-486
waitForSubProcesses()等待子进程退出 后缀省略lib/monitor/run.js322-336
spawnCommand()生成命令进程的实用程序 后缀省略lib/spawn.js7-74

来源: 后缀省略lib/monitor/run.js 后缀省略lib/spawn.js

与事件系统的集成

进程管理子系统与 Nodemon 的事件系统紧密集成

  1. 它监听“restart”和“quit”等事件
  2. 它发出“start”、“exit”和“crash”等事件
  3. 它将子进程的 stdout/stderr 数据作为事件转发

这种事件驱动的架构实现了文件监控系统与进程管理之间的松散耦合。

来源: 后缀省略lib/monitor/run.js175 后缀省略lib/monitor/run.js236 后缀省略lib/monitor/run.js251 后缀省略lib/monitor/run.js534-538