← Sandbox SDK / sandbox / guides
Выполнять команды
В этом руководстве показано, как эффективно выполнять команды в песочнице, обрабатывать вывод и управлять ошибками.
Выбор подходящего метода
SDK предлагает несколько способов запуска команд:
exec()- Запускает команду и ожидает полного результата. Подходит для разовых команд, таких как сборка, установка и скрипты.execStream()- Передаёт вывод в реальном времени. Подходит для длительных команд, где важна мгновенная обратная связь.startProcess()- Запускает фоновый процесс. Подходит для веб-серверов, баз данных и сервисов, которые должны работать постоянно.
Выполнение базовых команд
Используйте exec() для простых команд, которые быстро завершаются:
import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Execute a single command
const result = await sandbox.exec("python --version");
console.log(result.stdout); // "Python 3.11.0"
console.log(result.exitCode); // 0
console.log(result.success); // trueimport { getSandbox } from '@cloudflare/sandbox';
const sandbox = getSandbox(env.Sandbox, 'my-sandbox');
// Execute a single command
const result = await sandbox.exec('python --version');
console.log(result.stdout); // "Python 3.11.0"
console.log(result.exitCode); // 0
console.log(result.success); // trueБезопасная передача аргументов
При передаче пользовательского ввода или динамических значений избегайте интерполяции строк, чтобы предотвратить атаки внедрения кода:
// Unsafe - vulnerable to injection
const filename = userInput;
await sandbox.exec(`cat ${filename}`);
// Safe - use proper escaping or validation
const safeFilename = filename.replace(/[^a-zA-Z0-9_.-]/g, "");
await sandbox.exec(`cat ${safeFilename}`);
// Better - write to file and execute
await sandbox.writeFile("/tmp/input.txt", userInput);
await sandbox.exec("python process.py /tmp/input.txt");// Unsafe - vulnerable to injection
const filename = userInput;
await sandbox.exec(`cat ${filename}`);
// Safe - use proper escaping or validation
const safeFilename = filename.replace(/[^a-zA-Z0-9_.-]/g, '');
await sandbox.exec(`cat ${safeFilename}`);
// Better - write to file and execute
await sandbox.writeFile('/tmp/input.txt', userInput);
await sandbox.exec('python process.py /tmp/input.txt');Обработка ошибок
Команды могут завершиться ошибкой двумя способами:
- Ненулевой код выхода - Команда выполнилась, но завершилась с ошибкой (result.success === false)
- Ошибка выполнения - Команда не смогла запуститься (выбрасывает исключение)
try {
const result = await sandbox.exec("python analyze.py");
if (!result.success) {
// Command failed (non-zero exit code)
console.error("Analysis failed:", result.stderr);
console.log("Exit code:", result.exitCode);
// Handle specific exit codes
if (result.exitCode === 1) {
throw new Error("Invalid input data");
} else if (result.exitCode === 2) {
throw new Error("Missing dependencies");
}
}
// Success - process output
return JSON.parse(result.stdout);
} catch (error) {
// Execution error (couldn't start command)
console.error("Execution failed:", error.message);
throw error;
}try {
const result = await sandbox.exec('python analyze.py');
if (!result.success) {
// Command failed (non-zero exit code)
console.error('Analysis failed:', result.stderr);
console.log('Exit code:', result.exitCode);
// Handle specific exit codes
if (result.exitCode === 1) {
throw new Error('Invalid input data');
} else if (result.exitCode === 2) {
throw new Error('Missing dependencies');
}
}
// Success - process output
return JSON.parse(result.stdout);
} catch (error) {
// Execution error (couldn't start command)
console.error('Execution failed:', error.message);
throw error;
}Выполнение команд оболочки
Песочница поддерживает функции оболочки, такие как конвейеры, перенаправления и цепочки команд:
// Pipes and filters
const result = await sandbox.exec('ls -la | grep ".py" | wc -l');
console.log("Python files:", result.stdout.trim());
// Output redirection
await sandbox.exec("python generate.py > output.txt 2> errors.txt");
// Multiple commands
await sandbox.exec("cd /workspace && npm install && npm test");// Pipes and filters
const result = await sandbox.exec('ls -la | grep ".py" | wc -l');
console.log('Python files:', result.stdout.trim());
// Output redirection
await sandbox.exec('python generate.py > output.txt 2> errors.txt');
// Multiple commands
await sandbox.exec('cd /workspace && npm install && npm test');Выполнение скриптов Python
// Run inline Python
const result = await sandbox.exec('python -c "print(sum([1, 2, 3, 4, 5]))"');
console.log("Sum:", result.stdout.trim()); // "15"
// Run a script file
await sandbox.writeFile(
"/workspace/analyze.py",
`
import sys
print(f"Argument: {sys.argv[1]}")
`,
);
await sandbox.exec("python /workspace/analyze.py data.csv");// Run inline Python
const result = await sandbox.exec('python -c "print(sum([1, 2, 3, 4, 5]))"');
console.log('Sum:', result.stdout.trim()); // "15"
// Run a script file
await sandbox.writeFile('/workspace/analyze.py', `
import sys
print(f"Argument: {sys.argv[1]}")
`);
await sandbox.exec('python /workspace/analyze.py data.csv');Тайм-ауты
Задайте максимальное время выполнения команд, чтобы длительные операции не блокировали работу бесконечно.
Таймаут для каждой команды
Передайте timeout в параметрах, чтобы задать тайм-аут для отдельной команды:
const result = await sandbox.exec("npm run build", {
timeout: 30000, // 30 seconds
});const result = await sandbox.exec('npm run build', {
timeout: 30000 // 30 seconds
});Тайм-аут на уровне сессии
Задайте тайм-аут по умолчанию для всех команд в сессии с помощью commandTimeoutMs:
const session = await sandbox.createSession({
commandTimeoutMs: 10000, // 10s default for all commands
});
await session.exec("npm install"); // Times out after 10s
await session.exec("npm run build"); // Times out after 10s
// Per-command timeout overrides the session default
await session.exec("npm test", { timeout: 60000 }); // 60s for this commandconst session = await sandbox.createSession({
commandTimeoutMs: 10000 // 10s default for all commands
});
await session.exec('npm install'); // Times out after 10s
await session.exec('npm run build'); // Times out after 10s
// Per-command timeout overrides the session default
await session.exec('npm test', { timeout: 60000 }); // 60s for this commandГлобальный тайм-аут
Задайте COMMAND_TIMEOUT_MS переменная окружения чтобы задать глобальный таймаут по умолчанию для каждого exec() вызов во всех сессиях.
Приоритет тайм-аута
Если настроено несколько тайм-аутов, приоритет имеет наиболее конкретное значение:
- Для каждой команды
timeoutнаexec()(наивысший приоритет) - Уровень сессии
commandTimeoutMsнаcreateSession() - Глобальный
COMMAND_TIMEOUT_MSпеременная окружения (низший приоритет)
Если ни один параметр не задан, команды выполняются без ограничения по времени.
Тайм-аут не завершает процесс
Рекомендации
- Проверка кодов завершения - Всегда проверяйте
result.successиresult.exitCode - Проверка входных данных - Экранируйте или проверяйте пользовательский ввод, чтобы предотвратить инъекции
- Используйте потоковую передачу - Для длительных операций используйте
execStream()для обратной связи в реальном времени - Используйте фоновые процессы - Для сервисов, которые должны работать постоянно (веб-серверы, базы данных), используйте Руководство по фоновым процессам вместо этого
- Обработка ошибок - Проверьте stderr на наличие подробностей об ошибке
Устранение неполадок
Команда не найдена
Проверьте, что команда существует в контейнере:
const check = await sandbox.exec("which python3");
if (!check.success) {
console.error("python3 not found");
}const check = await sandbox.exec('which python3');
if (!check.success) {
console.error('python3 not found');
}Проблемы с рабочим каталогом
Используйте абсолютные пути или смените директорию:
// Use absolute path
await sandbox.exec("python /workspace/my-app/script.py");
// Or change directory
await sandbox.exec("cd /workspace/my-app && python script.py");// Use absolute path
await sandbox.exec('python /workspace/my-app/script.py');
// Or change directory
await sandbox.exec('cd /workspace/my-app && python script.py');Дополнительные материалы
- Справочник по Commands API - Полная документация по методу
- Руководство по фоновым процессам - Управление длительными процессами
- Руководство по потоковому выводу - Расширенные шаблоны потоковой передачи
- Руководство по Code Interpreter - Выполнение кода на более высоком уровне