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
EADDRINUSEfehlschlägt, wirft der StartGatewayLockError("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.