Перейти к основному содержанию

Блокировка Gateway

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

Зачем

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

Механизм

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