background option to the commands.run() method. This will return immediately and the command will continue to run in the sandbox until it finishes or its command timeout expires.
You can then later kill the command using the commands.kill() method.
Reconnect to a background command
A background command keeps running inside the sandbox even after the SDK disconnects, as long as its command timeout has not expired. Because sandboxes are long-lived, you can start a long task in one process, return immediately, and reconnect from a completely different process later to wait for it and collect the result. This is a common pattern for kicking off slow work (code generation, a build, a data job) from a serverless function or API handler: you start the command, store the sandbox ID and process ID, and let a later request pick the work back up. The example below starts a long-running command (run-codegen here is a placeholder for your own binary or script) and returns the two identifiers you need to reconnect: the sandbox ID and the command’s process ID (pid).
- Redirect output to a file. The streamed
stdout/stderrfrom a background command is only delivered to the process that started it. Writing to a file (> /home/user/gen.log 2>&1) gives you durable output you can read after reconnecting. - Pass untrusted input as an environment variable, not string interpolation. The prompt is provided through
envsand referenced as"$PROMPT", so the shell inserts it as a literal value. Interpolating user input directly into the command string (for example with a template literal) would let inputs like$(...)or backticks run as commands inside the sandbox. - Disable the command timeout. On
commands.run(),timeoutMs: 0(timeout=0in Python) disables the command timeout. The default is 60 seconds, and when it expires the process is killed in the sandbox, even whenbackgroundis set. With the timeout disabled, the process keeps running after the client disconnects or exits, andcommands.connect()reattaches to it. If the connection breaks without closing, for example on a network loss, a command that writes a lot to stdout or stderr can stall, so redirect its output to a file as the example does. Oncommands.connect(), the same option only limits how long the client waits for the command, so the example sets it there too. Set the sandboxtimeoutMs/timeouthigh enough to outlast the whole job (15 minutes above). See sandbox persistence if you need it to survive even longer. - Persist the IDs. Return or store
sandboxIdandpid(for example in a database or the response of an API call). They are all a later process needs to callSandbox.connect()andcommands.connect().
commands.connect(pid) reattaches to the running command, and handle.wait() blocks until it finishes. If you don’t know the pid, you can look up running processes with sandbox.commands.list().