Skip to content

Subprocess zh

pawaca edited this page Aug 30, 2026 · 1 revision

子进程

未实现 — Edge 目前用 just-bash 执行命令。原生子进程可通过 Cloudflare Containers 实现。

上游参考:子进程

上游提供了什么

子进程子系统(ctx.subprocess)管理子进程执行,支持显式 I/O 处置、资源限制和树级终止。由两部分组成:

  • Service Definitiondsh-subprocess)— 能力接缝:spawn()spawnTerminal()、可执行文件解析、受管的 DSH_* 环境命名空间。
  • Service Providerdsh-subprocess-local)— 使用 node:child_process 的 Node.js 实现。

关键设计:接缝不施加默认值——每个 I/O 处置(pipe/inherit/collect)、限制和目录都是显式的。终止是树级的:SIGTERM → 宽限期 → SIGKILL 跨整个进程树。waitForExit() 在返回前观察所有子孙进程。

Edge 当前状态

未实现 dsh-subprocessdsh-subprocess-local 均未安装。Edge 无法 spawn 原生进程。

命令执行由 just-bash 处理——一个在 Durable Object 内运行的纯 JavaScript shell。它提供了常用命令的内置实现(grepsedawkfindsortdiff 等 20+ 个),操作 Computer VFS。系统提示词明确告知模型:"The shell is just-bash, not Linux: native binaries and background processes are unavailable."

这覆盖了最常见的 agent 用例(文件操作和文本处理),但无法运行编译的二进制文件、语言运行时(pythonnode)、包管理器(npmpip)或构建工具(makecargo)。

Cloudflare 产品支持

产品 能力 所需计划
Cloudflare Containers 附加到 Workers 的完整 Linux 容器。可 spawn 原生进程、安装包、运行任何二进制。实现真正子进程后端的主要途径。 Workers Paid 或 Enterprise
Cloudflare Computer Edge 已用于 VFS。提供 WorkerShellBackend 隔离执行模式。不是完整子进程——仅限 just-bash shell。 Free(已包含)

集成路径:Cloudflare Containers(2025 年发布)可以在 Worker 旁运行完整 Linux 环境。一个实现上游 SubprocessService 接口的 ContainerSubprocessProvider 可以将 spawn() 调用委托给容器的进程命名空间。容器生命周期由 DO 管理——首次子进程请求时启动,session 内复用,session disposal 时终止。

免费计划用户继续使用 just-bash。子进程能力是付费升级——配置了 Container binding 后,模型可以使用真正的 pythonnodegit 等。

架构总结

组件 分类 状态
SubprocessService(ctx.subprocess 缺失 未安装
just-bash shell 替换 覆盖基本命令执行
Container 子进程后端 未来 Cloudflare Containers(付费)

关键观察:子进程在 Edge 上并非不可能——它受限于 Cloudflare Containers,后者在 2025 年已投入生产。架构清晰:安装上游 dsh-subprocess 接缝,提供 Container 支持的实现,并根据 Container binding 是否可用来控制开关。免费用户保持 just-bash;付费用户获得真正的 Linux 进程。

TODO

**评估 Cloudflare Containers 作为子进程后端。**关键问题:(1) 能否从 DO spawn Container 并暴露其进程命名空间?(2) 冷启动延迟多少?(3) 上游 SubprocessService 接口(spawnspawnTerminalterminatewaitForExit)能否由 Container API 满足?(4) 如何处理免费/付费分层——基于 binding 存在性的 stub provider vs 真实 provider?

English

中文

Clone this wiki locally