本文详细介绍了 Nodemon 的进程管理子系统,该系统处理子进程从生成到终止的生命周期。它涵盖了 Nodemon 如何启动、重启和终止应用程序进程,管理进程间通信,以及处理平台特定的考量。有关如何检测文件更改以触发这些进程操作的信息,请参阅文件监控系统。
Nodemon 的进程管理负责将您的 Node.js 应用程序作为子进程执行并管理其生命周期。当检测到文件更改时,此子系统会处理终止现有进程并使用更新后的代码生成新进程。
来源: lib/monitor/run.js22-320 lib/monitor/run.js440-486
Nodemon 根据运行的应用程序使用不同的 Node.js 子进程方法
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 启动一个进程时,它会
来源: lib/monitor/run.js22-145 lib/monitor/run.js147-178
当文件更改时,Nodemon 会重启进程
来源: lib/monitor/run.js534-538 lib/monitor/run.js440-486
Nodemon 根据退出条件以不同的方式处理进程终止
| 退出条件 | 行为 |
|---|---|
| 干净退出 (代码 0) | 等待文件更改后重启 |
| 更改后被终止 | 立即使用新代码重启 |
| 应用程序崩溃 | 根据配置等待文件更改或退出 |
| SIGINT/SIGTERM | 清理并退出 nodemon |
Nodemon 在不同操作系统上以不同的方式处理进程管理
在 Windows 上
cmd 而非 sh 来生成进程windowsVerbatimArguments 和 windowsHide 选项taskkill 进行强制终止来源: 78-97 后缀省略lib/monitor/run.js344-407
在类 Unix 系统上
psTree 查找并终止所有子进程来源: 后缀省略lib/monitor/run.js409-436
Nodemon 管理父子进程之间的标准 I/O 流
来源: 后缀省略lib/monitor/run.js51-59 后缀省略lib/monitor/run.js147-166 后缀省略lib/monitor/run.js284-314
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 对子进程流进行管道传输
来源: 后缀省略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 的进程管理包括强大的错误处理功能
来源: 后缀省略lib/monitor/run.js179-188 后缀省略lib/monitor/run.js195-221 后缀省略lib/monitor/run.js250-269
进程管理功能主要在以下文件中实现
lib/monitor/run.js - 进程生成和生命周期管理的主要实现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 的事件系统紧密集成
这种事件驱动的架构实现了文件监控系统与进程管理之间的松散耦合。
来源: 后缀省略lib/monitor/run.js175 后缀省略lib/monitor/run.js236 后缀省略lib/monitor/run.js251 后缀省略lib/monitor/run.js534-538