Фоновый Exec + Инструмент Process

OpenClaw запускает команды оболочки через инструмент exec и сохраняет долгоживущие задачи в памяти. Инструмент process управляет этими фоновыми сессиями.

Инструмент exec

Ключевые параметры:

  • command (обязательно)
  • yieldMs (по умолчанию 10000): авто-фон после этой задержки
  • background (bool): фон немедленно
  • timeout (секунды, по умолчанию 1800): завершить процесс после этого тайм-аута
  • elevated (bool): запуск на хосте, если включен/разрешен режим elevated
  • Нужен настоящий TTY? Установите pty: true.
  • workdir, env

Поведение:

  • Запуски на переднем плане возвращают вывод напрямую.
  • При переходе в фон (явно или по тайм-ауту), инструмент возвращает status: "running" + sessionId и короткий хвост.
  • Вывод сохраняется в памяти до тех пор, пока сессия не будет опрошена или очищена.
  • Если инструмент process запрещен, exec работает синхронно и игнорирует yieldMs/background.

Мостирование дочерних процессов

При порождении долгоживущих дочерних процессов вне инструментов exec/process (например, перезапуски CLI или помощники шлюза), подключите помощник моста дочерних процессов, чтобы сигналы завершения пересылались, а слушатели отключались при выходе/ошибке. Это позволяет избежать осиротевших процессов на systemd и поддерживает согласованное поведение завершения на разных платформах.

Переопределения окружения:

  • PI_BASH_YIELD_MS: задержка по умолчанию (мс)
  • PI_BASH_MAX_OUTPUT_CHARS: ограничение вывода в памяти (символы)
  • OPENCLAW_BASH_PENDING_MAX_OUTPUT_CHARS: ограничение ожидающего stdout/stderr на поток (символы)
  • PI_BASH_JOB_TTL_MS: TTL для завершенных сессий (мс, ограничено 1м–3ч)

Конфигурация (предпочтительно):

  • tools.exec.backgroundMs (по умолчанию 10000)
  • tools.exec.timeoutSec (по умолчанию 1800)
  • tools.exec.cleanupMs (по умолчанию 1800000)
  • tools.exec.notifyOnExit (по умолчанию true): ставит в очередь системное событие + запрашивает heartbeat, когда фоновый exec завершается.

Инструмент process

Действия:

  • list: запущенные + завершенные сессии
  • poll: слить новый вывод для сессии (также сообщает статус выхода)
  • log: прочитать агрегированный вывод (поддерживает offset + limit)
  • write: отправить stdin (data, опциональный eof)
  • kill: завершить фоновую сессию
  • clear: удалить завершенную сессию из памяти
  • remove: завершить, если запущена, иначе очистить, если завершена

Примечания:

  • Только фоновые сессии перечисляются/сохраняются в памяти.
  • Сессии теряются при перезапуске процесса (нет сохранения на диске).
  • Журналы сессий сохраняются в истории чата, только если вы запускаете process poll/log и результат инструмента записывается.
  • process имеет область видимости по агенту; видит только сессии, запущенные этим агентом.
  • process list включает производное name (глагол команды + цель) для быстрого сканирования.
  • process log использует построчные offset/limit (пропустите offset для получения последних N строк).

Примеры

Запустить длинную задачу и опросить позже:

\{"tool": "exec", "command": "sleep 5 && echo done", "yieldMs": 1000\}
\{"tool": "process", "action": "poll", "sessionId": "<id>"\}

Запустить немедленно в фоне:

\{"tool": "exec", "command": "npm run build", "background": true\}

Отправить stdin:

\{"tool": "process", "action": "write", "sessionId": "<id>", "data": "y\\n"\}