后台任务与流程管理
后台任务与进程管理
相关源文件
以下文件为本维基页面的生成提供了上下文:
src/background.rssrc/build.rssrc/cli/selfdev.rssrc/cli/terminal.rssrc/cli/tui_launch.rssrc/message/notifications.rssrc/plan.rssrc/server/reload.rssrc/server/runtime.rssrc/server/tests.rssrc/setup_hints.rssrc/setup_hints/macos_launcher.rssrc/setup_hints/windows_setup.rssrc/tool/bash.rssrc/tool/bg.rssrc/tui/app/helpers.rssrc/tui/app/remote_notifications.rs
BackgroundTaskManager 提供了一个健壮的系统,用于在后台执行长时间运行的工具,同时保持代理的响应能力。它负责进程生命周期管理、基于文件的持久化以实现崩溃恢复,以及通过全局事件总线进行实时状态更新。
后台任务生命周期
后台任务由 BackgroundTaskManager src/background.rs:36-39 管理,它会跟踪活动进程并根据文件系统协调其状态。任务会被分配一个由时间戳和随机字符生成的唯一 ID src/background.rs:57-77,并将其输出和元数据存储在专用的任务目录中 src/background.rs:51-54。
生成与收养
当任务被生成时,管理器会创建两个主要文件:
- 输出文件:一个
.output文件,包含命令的原始stdout和stderrsrc/background.rs:79-81。 - 状态文件:一个
.status.json文件,包含TaskStatusFile结构体,其中记录了 PID、启动时间和当前状态src/background.rs:83-85。
"收养"模式允许管理器恢复在先前进程执行中启动的任务(例如,在 jcode 热重载或崩溃之后)。它会扫描任务目录,并通过读取这些状态文件来重建 RunningTask 映射 src/background.rs:125-128。
基于 PID 的协调
对于分离的任务(即那些预期比当前工具执行上下文存活更久的任务),管理器会使用操作系统进程表进行协调:
- 它会检查记录的
pid是否仍在运行src/background.rs:151-151。 - 它会尝试回收子进程以获取退出码
src/background.rs:149-149。 - 如果进程已结束但未捕获到退出码,它会回退到解析输出文件中的终止标记
src/background.rs:157-157。
数据流:任务执行
下图展示了从工具请求后台任务到最终状态通知的流程。
后台任务数据流
来源:src/background.rs:36-185,src/tool/bash.rs:1-30,src/background.rs:31-33
进程管理与标识
jcode 使用特定的进程标题和命名约定,使子系统能够识别并与特定会话交互。
进程标题
标题会动态设置,以反映会话 ID 和模式(例如,自开发模式)。TUI 客户端使用 crossterm 和内部标题辅助函数更新终端标题 src/cli/tui_launch.rs:152-159。
| 进程角色 | 标题生成逻辑 | 实现位置 |
|---|---|---|
| TUI 客户端 | resumed_window_title(session_id) | src/cli/tui_launch.rs:20-29 |
| 自开发模式 | set_client_session_title(id, true) | src/cli/selfdev.rs:62-62 |
| 远程客户端 | set_client_remote_display_title | src/cli/tui_launch.rs:144-148 |
来源:src/cli/tui_launch.rs:20-160,src/cli/selfdev.rs:62-62
退出标记解析模式
由于后台任务可能被分离,jcode 不能总是依赖父子关系来捕获退出码。为了解决这个问题,它会在输出文件末尾追加一个特定的标记(定义为 EXIT_MARKER_PREFIX)src/background.rs:30-33。
parse_exit_code_from_output 函数从输出文件的底部向上读取,以提取该退出码 src/background.rs:116-123,从而确保即使管理器在任务运行时重启,状态也能保持准确。
进度与检查点解析
对于长时间运行的后台命令,jcode 实现了一个基于正则表达式的解析系统,用于从 stdout 中提取进度信息 src/tool/bash.rs:26-30。
- 结构化进度:命令可以打印
JCODE_PROGRESS {"percent": 42}以实现可靠的更新src/tool/bash.rs:26-28。 - 启发式进度:系统使用专门的正则表达式解析常见模式,如
42%、3/10 tests或1.5/3.0 GiBsrc/tool/bash.rs:32-71。 - 里程碑:
JCODE_CHECKPOINT {"message": "..."}会触发里程碑式的唤醒,供代理使用src/tool/bash.rs:27-28。
来源:src/tool/bash.rs:26-156
代码实体映射
下图将"进程管理"的自然语言概念与实现这些概念的具体 Rust 结构体和函数联系起来。
进程与任务实体映射
来源:src/background.rs:36-112,src/tool/bg.rs:34-142,src/tool/bash.rs:145-162
重载与恢复
在服务器热重载期间,系统使用 exec 模式来替换进程,同时保留环境 src/server/reload.rs:116-130。
- 优雅关闭:在
exec发生之前,活动会话会收到关闭通知src/server/reload.rs:99-106。 - 套接字清理:替换后的守护进程在绑定新套接字之前会解除旧套接字的链接
src/server/reload.rs:16-19。 - 任务恢复:后台任务会作为分离的进程继续运行。重启后,
BackgroundTaskManager会通过扫描任务目录并检查其 PID 来"收养"这些孤儿进程src/background.rs:136-154。
来源:src/server/reload.rs:16-158,src/background.rs:136-185