---
read_when:
    - Запуск или отладка процесса Gateway
    - Исследование принудительного режима единственного экземпляра
summary: Защита singleton Gateway с использованием привязки прослушивателя WebSocket
title: Блокировка Gateway
x-i18n:
    generated_at: "2026-06-28T22:57:22Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 85a1cb55f08d47d36fde25900e4247ef01c9a6800bf017fbff44a337f299ce13
    source_path: gateway/gateway-lock.md
    workflow: 16
---

## Зачем

- Гарантировать, что на одном хосте для одного базового порта запущен только один экземпляр 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.

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

- [Несколько Gateway](/ru/gateway/multiple-gateways) — запуск нескольких экземпляров с уникальными портами
- [Устранение неполадок](/ru/gateway/troubleshooting) — диагностика `EADDRINUSE` и конфликтов портов
