后台命令适合启动 Web 服务、长时间运行任务或需要分阶段读取输出的进程。
启动后台命令
将命令设置为后台运行后,SDK 会立即返回进程对象,后续可以继续访问端口、连接进程或终止进程。
TypeScript 示例:
import { Sandbox } from "e2b";
const sandbox = await Sandbox.create("code-interpreter-v1", {
apiKey: process.env.E2B_API_KEY,
apiUrl: process.env.E2B_API_URL,
domain: process.env.E2B_DOMAIN,
});
try {
const cmd = await sandbox.commands.run("python3 -m http.server 8000", {
background: true,
timeoutMs: 10 * 60 * 1000,
});
const host = sandbox.getHost(8000);
console.log(`https://${host}`);
const running = await sandbox.commands.list();
console.log(running);
await cmd.kill();
} finally {
await sandbox.kill();
}Python 示例:
import os
from e2b import Sandbox
sandbox = Sandbox.create(
"code-interpreter-v1",
api_key=os.environ["E2B_API_KEY"],
api_url=os.environ["E2B_API_URL"],
domain=os.environ["E2B_DOMAIN"],
)
try:
process = sandbox.commands.run(
"python3 -m http.server 8000",
background=True,
timeout=10 * 60,
)
host = sandbox.get_host(8000)
print(f"https://{host}")
running = sandbox.commands.list()
print(running)
process.kill()
finally:
sandbox.kill()连接和停止进程
已知进程 ID 时,可以通过 sandbox.commands.connect() 连接到运行中的进程;需要停止进程时,可以调用进程对象的 kill(),也可以使用 sandbox.commands.kill()。
不同 SDK 版本中进程 ID 字段和连接参数命名可能不同,建议先通过 sandbox.commands.list() 查看返回结构,再按所用 SDK 的类型定义调用 connect() 或 kill()。如果只是当前调用启动的后台命令,优先保存返回的进程对象并调用 process.kill()。
使用建议
启动服务类进程时,先确认服务监听端口,再通过
sandbox.getHost(port)获取访问地址。后台进程不会因为 SDK 调用返回而自动结束,但仍受命令执行超时时间约束。E2B SDK 的命令超时默认通常为 60 秒;长时间运行的服务或任务应显式设置合适的超时时间,例如 TypeScript 使用
timeoutMs,Python 使用timeout,并在任务完成后主动终止进程或终止 Sandbox。需要持续读取输出的任务,优先使用后台进程和连接进程的方式,不建议用长超时的同步命令阻塞主流程。
对外提供访问地址的服务,应在业务侧设置鉴权或使用一次性任务 URL,避免暴露敏感接口。
该文章对您有帮助吗?