--- title: "沙盒生命周期" description: "了解沙盒存活的时间,如何延长或重新连接沙盒,以及什么时候将工作提升为 Deploy 应用。" --- 沙盒是有意设计为短暂存在的。它们在毫秒内启动,完成任务后立即消失——减少不受信任代码的攻击面,并免去基础设施的维护工作。不过,你可以精确控制沙盒的存活时间,甚至在需要调试时后续重新连接。 ## 默认生命周期:`"session"` ```tsx await using sandbox = await Sandbox.create(); ``` 若不设置任何选项,沙盒会在脚本执行期间存活。一旦关闭 `Sandbox` 实例,微虚拟机(microVM)会关闭并释放所有资源。这样可以保持成本可预测性,防止出现孤儿基础设施。 ```py from deno_sandbox import DenoDeploy sdk = DenoDeploy() with sdk.sandbox.create() as sandbox: print(f"Sandbox {sandbox.id} is ready.") ``` ```py from deno_sandbox import AsyncDenoDeploy sdk = AsyncDenoDeploy() async with sdk.sandbox.create() as sandbox: print(f"Sandbox {sandbox.id} is ready.") ``` 默认情况下,沙盒在你的脚本执行期间存活。关闭沙盒实例后,微虚拟机关闭并释放所有资源。这样可以保持成本可控,并防止产生孤儿基础设施。 ## 基于时长的生命周期 提供一个时长字符串,可以让沙盒在客户端断开连接后继续存活: ```tsx const sandbox = await Sandbox.create({ timeout: "5m" }); const id = sandbox.id; await sandbox.close(); // 进程现在可以退出了 // 稍后 const reconnected = await Sandbox.connect({ id }); ``` 支持的后缀:`s`(秒)和 `m`(分钟)。示例:`"30s"`、`"5m"`、`"90s"`。此模式适用于手动检查、SSH 调试,或当机器人需要中途恢复工作时。 ```py sdk = DenoDeploy() with sdk.sandbox.create(timeout="5m") as sandbox: sandbox_id = sandbox.id sandbox.close() # process can exit now # later with sdk.sandbox.connect(sandbox_id) as reconnected: print(f"Reconnected to {reconnected.id}") ``` ```py sdk = AsyncDenoDeploy() async with sdk.sandbox.create(timeout="5m") as sandbox: sandbox_id = sandbox.id await sandbox.close() # process can exit now # later async with sdk.sandbox.connect(sandbox_id) as reconnected: print(f"Reconnected to {reconnected.id}") ``` ## 长时间生命周期 如果需要更长时间的生命周期,可以使用 [`sandbox.deploy()`](./promote.md) 将基于时长的沙盒提升为 Deno Deploy 应用。 ## 强制终止沙盒 - `await sandbox.kill()` 会立即停止虚拟机并释放生命周期,用于在沙盒本应自然结束之前强行销毁它。 - 杀死沙盒会使暴露的 HTTP URL、SSH 会话以及所有挂载卷失效,但当你的代码丢弃对沙盒的最后引用或配置的时长到期时,这些也会自动失效。 ## 扩展沙盒生命周期 敬请期待。 ```tsx const newTimeout = await sandbox.extendTimeout("30m"); console.log(`Sandbox now expires at ${newTimeout}`); ``` ```bash deno sandbox extend sbx_ord_abc123def456 30m ``` 所有活跃连接和进程会继续正常运行,同时沙盒的过期时间被更新。 ## 相关 API - [`Sandbox.create()`](./create.md) – 在创建时传入 `timeout` 选项。 - `Sandbox.connect({ id })` – 重新控制基于时长的沙盒。 - `Sandbox.kill()` – 提前终止。 - [`Expose HTTP`](./expose_http.md) 和 [`Expose SSH`](./expose_ssh.md) – 请注意它们的 URL/凭证随沙盒生命周期终止而失效。