Chuyển đến nội dung chính

Khóa Gateway

Cập nhật lần cuối: 2025-12-11

Vì sao

  • Đảm bảo chỉ một phiên bản gateway chạy cho mỗi cổng cơ sở trên cùng một máy chủ; các gateway bổ sung phải dùng profile tách biệt và cổng riêng.
  • Chịu được crash/SIGKILL mà không để lại tệp khóa lỗi thời.
  • Thất bại nhanh với thông báo lỗi rõ ràng khi cổng điều khiển đã bị chiếm.

Cơ chế

  • Gateway ràng buộc listener WebSocket (mặc định ws://127.0.0.1:18789) ngay khi khởi động bằng một TCP listener độc quyền.
  • Nếu việc bind thất bại với EADDRINUSE, quá trình khởi động ném 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 tiến trình thoát theo bất kỳ cách nào, bao gồm crash và SIGKILL—không cần tệp khóa riêng hay bước dọn dẹp.
  • Khi tắt, gateway đóng máy chủ WebSocket và máy chủ HTTP nền tảng để giải phóng cổng kịp thời.

Bề mặt lỗi

  • Nếu một tiến trình khác đang giữ cổng, quá trình khởi động ném lỗi GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>").
  • Các lỗi bind khác được hiển thị là 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 tiến trình khác, lỗi vẫn như nhau; hãy 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ì cơ chế bảo vệ PID nhẹ của riêng nó trước khi khởi chạy gateway; khóa ở thời gian chạy được thực thi bằng việc bind WebSocket.