Khóa Gateway
Cập nhật lần cuối: 2025-12-11
Tại sao
- Đảm bảo chỉ có một instance gateway chạy trên mỗi cổng cơ bản trên cùng một máy chủ; các gateway bổ sung phải sử dụng hồ sơ riêng biệt và cổng duy nhất.
- Khả năng phục hồi sau sự cố/SIGKILL mà không để lại file khóa cũ.
- Nhanh chóng báo lỗi rõ ràng khi cổng điều khiển đã bị chiếm dụng.
Cơ chế
- Gateway gắn WebSocket listener (mặc định
ws://127.0.0.1:18789) ngay khi khởi động bằng cách sử dụng một TCP listener độc quyền.
- Nếu việc gắn kết thất bại với
EADDRINUSE, quá trình khởi động sẽ ném ra lỗi GatewayLockError("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 bất kỳ quá trình nào kết thúc, bao gồm cả sự cố và SIGKILL—không cần file khóa riêng hoặc bước dọn dẹp.
- Khi tắt, gateway đóng máy chủ WebSocket và máy chủ HTTP cơ bản để giải phóng cổng ngay lập tức.
Bề mặt lỗi
- Nếu một quá trình khác giữ cổng, quá trình khởi động sẽ ném ra lỗi
GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>").
- Các lỗi gắn kết khác sẽ xuất hiện dưới dạng
GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …").
Ghi chú vận hành
- Nếu cổng bị chiếm bởi một quá trình khác, lỗi sẽ giống nhau; giải phóng cổng hoặc chọn cổng khác với
openclaw gateway --port <port>.
- Ứng dụng macOS vẫn duy trì một cơ chế bảo vệ PID nhẹ trước khi khởi chạy gateway; khóa runtime được thực thi bởi WebSocket bind.
Last modified on March 22, 2026