Gateway Lock
Cập nhật lần cuối: 11/12/2025
Tại sao cần Gateway Lock
- Đảm bảo chỉ có một Gateway instance chạy trên mỗi base port của cùng một máy; các Gateway bổ sung phải dùng profile riêng biệt và port khác nhau.
- Tồn tại qua các lần crash/SIGKILL mà không để lại file lock cũ.
- Báo lỗi nhanh và rõ ràng khi control port đã bị chiếm dụng.
Cơ chế hoạt động
- Gateway bind WebSocket listener (mặc định
ws://127.0.0.1:18789) ngay khi khởi động bằng một exclusive TCP listener. - Nếu bind thất bại với lỗi
EADDRINUSE, quá trình khởi động sẽ throwGatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>"). - Hệ điều hành tự động giải phóng listener khi process thoát (bao gồm cả crash và SIGKILL)—không cần file lock riêng hay bước cleanup nào cả.
- Khi shutdown, Gateway đóng WebSocket server và HTTP server bên dưới để giải phóng port ngay lập tức.
Các lỗi có thể gặp
- Nếu một process khác đang giữ port, quá trình khởi động sẽ throw
GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>"). - Các lỗi bind khác sẽ hiển thị dưới dạng
GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …").
Lưu ý khi vận hành
- Nếu port bị chiếm bởi một process khác, lỗi sẽ giống nhau; các bạn cần giải phóng port hoặc chọn port khác bằng lệnh
openclaw gateway --port <port>. - Ứng dụng macOS vẫn duy trì cơ chế PID guard nhẹ riêng trước khi spawn Gateway; runtime lock được thực thi bởi WebSocket bind.