diff --git a/src/content/docs/sandbox/api/commands.mdx b/src/content/docs/sandbox/api/commands.mdx
index c8aacaea1d39c00..867b6c167a4fe78 100644
--- a/src/content/docs/sandbox/api/commands.mdx
+++ b/src/content/docs/sandbox/api/commands.mdx
@@ -106,6 +106,7 @@ const process = await sandbox.startProcess(command: string, options?: ProcessOpt
- `getLogs()` - Get accumulated logs
- `waitForPort()` - Wait for process to listen on a port
- `waitForLog()` - Wait for pattern in process output
+- `waitForExit()` - Wait for process to exit and get exit code
```
@@ -316,6 +317,51 @@ await server.waitForLog('Ready', 30000);
- `ProcessReadyTimeoutError` - If pattern is not found within timeout
- `ProcessExitedBeforeReadyError` - If process exits before pattern appears
+### `process.waitForExit()`
+
+Wait for a process to exit and retrieve its exit code.
+
+```ts
+const result = await process.waitForExit(timeout?: number): Promise
+```
+
+**Parameters**:
+- `timeout` - Maximum wait time in milliseconds (optional)
+
+**Returns**: `Promise` with:
+- `exitCode` - The process exit code (0 for success, non-zero for errors)
+
+
+```
+const build = await sandbox.startProcess('npm run build');
+
+// Wait for build to complete
+const result = await build.waitForExit();
+
+if (result.exitCode === 0) {
+ console.log('Build succeeded');
+} else {
+ console.error('Build failed with exit code:', result.exitCode);
+
+ // Get logs to see what went wrong
+ const logs = await build.getLogs();
+ console.error('Build logs:', logs);
+}
+
+// With timeout
+const test = await sandbox.startProcess('npm test');
+try {
+ const result = await test.waitForExit(60000); // 60 second timeout
+ console.log('Tests completed with exit code:', result.exitCode);
+} catch (error) {
+ console.error('Tests timed out after 60 seconds');
+}
+```
+
+
+**Throws**:
+- `ProcessReadyTimeoutError` - If process does not exit within timeout
+
## Related resources
- [Background processes guide](/sandbox/guides/background-processes/) - Managing long-running processes
diff --git a/src/content/docs/sandbox/guides/background-processes.mdx b/src/content/docs/sandbox/guides/background-processes.mdx
index a523eba829da408..47f1ca057a06db9 100644
--- a/src/content/docs/sandbox/guides/background-processes.mdx
+++ b/src/content/docs/sandbox/guides/background-processes.mdx
@@ -110,6 +110,49 @@ console.log('Server is ready:', result.line);
```
+## Wait for process completion
+
+For short-lived processes like builds or tests, wait for the process to exit and check the exit code:
+
+
+```
+const build = await sandbox.startProcess('npm run build');
+
+// Wait for build to complete
+const result = await build.waitForExit();
+
+if (result.exitCode === 0) {
+ console.log('Build succeeded');
+
+ // Get the output
+ const logs = await sandbox.getProcessLogs(build.id);
+ console.log('Build output:', logs);
+} else {
+ console.error('Build failed with exit code:', result.exitCode);
+}
+```
+
+
+With a timeout to prevent waiting indefinitely:
+
+
+```
+const test = await sandbox.startProcess('npm test');
+
+try {
+ // Wait up to 60 seconds for tests to complete
+ const result = await test.waitForExit(60000);
+
+ console.log('Tests completed with exit code:', result.exitCode);
+} catch (error) {
+ if (error.code === 'PROCESS_READY_TIMEOUT') {
+ console.error('Tests timed out after 60 seconds');
+ await sandbox.killProcess(test.id);
+ }
+}
+```
+
+
## Monitor process logs
Stream logs in real-time:
@@ -226,6 +269,7 @@ When using `keepAlive: true`, containers will not automatically timeout. You **m
## Best practices
- **Wait for readiness** - Use `waitForPort()` or `waitForLog()` to detect when services are ready
+- **Wait for completion** - Use `waitForExit()` for build processes and scripts to check exit codes
- **Clean up** - Always stop processes when done
- **Handle failures** - Monitor logs for errors and restart if needed
- **Use try/finally** - Ensure cleanup happens even on errors