Gateway-Sperre

Zuletzt aktualisiert: 2025-12-11

Warum

  • Sicherstellen, dass nur eine Gateway-Instanz pro Basis-Port auf demselben Host läuft; zusätzliche Gateways müssen isolierte Profile und einzigartige Ports verwenden.
  • Abstürze/SIGKILL überleben, ohne verwaiste Lock-Dateien zu hinterlassen.
  • Schnell mit einer klaren Fehlermeldung abbrechen, wenn der Control-Port bereits belegt ist.

Mechanismus

  • Das Gateway bindet den WebSocket-Listener (Standard ws://127.0.0.1:18789) sofort beim Start über einen exklusiven TCP-Listener.
  • Wenn der Bind mit EADDRINUSE fehlschlägt, wirft der Start GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>").
  • Das Betriebssystem gibt den Listener automatisch bei jedem Prozessende frei, einschließlich Abstürzen und SIGKILL — keine separate Lock-Datei oder Aufräumaktion nötig.
  • Beim Herunterfahren schließt das Gateway den WebSocket-Server und den zugrunde liegenden HTTP-Server, um den Port zeitnah freizugeben.

Fehleroberfläche

  • Wenn ein anderer Prozess den Port belegt, wirft der Start GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>").
  • Andere Bind-Fehler erscheinen als GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …").

Betriebshinweise

  • Wenn der Port von einem anderen Prozess belegt ist, ist die Fehlermeldung identisch; gib den Port frei oder wähle einen anderen mit openclaw gateway --port <port>.
  • Die macOS-App unterhält weiterhin einen eigenen leichtgewichtigen PID-Guard vor dem Starten des Gateways; die Laufzeitsperre wird durch den WebSocket-Bind erzwungen.