Gateway lock

Последнее обновление: 2025-12-11

Зачем

  • Гарантировать, что на одном хосте работает только один экземпляр gateway на базовый порт; дополнительные gateway должны использовать изолированные профили и уникальные порты.
  • Переживать сбои/SIGKILL без оставления устаревших файлов блокировки.
  • Быстро завершаться с понятной ошибкой, когда управляющий порт уже занят.

Механизм

  • Gateway привязывает слушатель WebSocket (по умолчанию ws://127.0.0.1:18789) немедленно при запуске, используя эксклюзивный TCP-слушатель.
  • Если привязка не удается с EADDRINUSE, запуск выбрасывает GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>").
  • ОС автоматически освобождает слушатель при любом завершении процесса, включая сбои и SIGKILL — отдельный файл блокировки или шаг очистки не требуется.
  • При завершении gateway закрывает WebSocket-сервер и базовый HTTP-сервер, чтобы быстро освободить порт.

Поверхность ошибок

  • Если другой процесс удерживает порт, запуск выбрасывает GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>").
  • Другие ошибки привязки всплывают как GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …").

Операционные замечания

  • Если порт занят другим процессом, ошибка та же; освободите порт или выберите другой с openclaw gateway --port <port>.
  • Приложение macOS по-прежнему поддерживает свою собственную легкую защиту PID перед порождением gateway; блокировка среды выполнения обеспечивается привязкой WebSocket.