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

Зачем

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

Механизм

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

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

  • Если порт удерживает другой процесс, запуск выбрасывает 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>.
  • Под управлением сервисного супервизора новый процесс Gateway, который видит существующий исправный ответчик /healthz, оставляет управление за этим процессом. В systemd дублирующий запускатель завершается с кодом 78, поэтому значение по умолчанию RestartPreventExitStatus=78 не дает Restart=always зациклиться при конфликте блокировки или EADDRINUSE. Если существующий процесс так и не становится исправным, число повторных попыток ограничено, и запуск завершается с понятной ошибкой блокировки вместо бесконечного цикла.
  • Приложение macOS по-прежнему поддерживает собственную легковесную PID-защиту перед запуском Gateway; блокировка времени выполнения обеспечивается файлом блокировки и привязкой HTTP/WebSocket.

Связанные разделы