Gateway

Блокування Gateway

Навіщо

  • Гарантувати, що на одному хості для одного базового порту працює лише один екземпляр 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.

Пов’язане