Gateway

การล็อก Gateway

เหตุผล

  • ตรวจสอบให้แน่ใจว่ามี Gateway เพียงหนึ่งอินสแตนซ์ที่ทำงานต่อพอร์ตฐานหนึ่งพอร์ตบนโฮสต์เดียวกัน; Gateway เพิ่มเติมต้องใช้โปรไฟล์ที่แยกกันและพอร์ตที่ไม่ซ้ำกัน
  • ทนต่อการหยุดทำงาน/SIGKILL โดยไม่ทิ้งไฟล์ล็อกค้างไว้
  • ล้มเหลวอย่างรวดเร็วพร้อมข้อผิดพลาดที่ชัดเจนเมื่อพอร์ตควบคุมถูกใช้งานอยู่แล้ว

กลไก

  • Gateway จะขอไฟล์ล็อกต่อการกำหนดค่าภายใต้ไดเรกทอรีล็อกสถานะก่อน แล้วตรวจสอบพอร์ตที่กำหนดค่าไว้เพื่อหาตัวรับการเชื่อมต่อที่มีอยู่
  • หากเจ้าของล็อกที่บันทึกไว้หายไป พอร์ตว่าง หรือล็อกค้างอยู่ การเริ่มต้นจะยึดคืนล็อกและดำเนินต่อ
  • จากนั้น Gateway จะผูกตัวรับการเชื่อมต่อ HTTP/WebSocket (ค่าเริ่มต้น ws://127.0.0.1:18789) โดยใช้ตัวรับการเชื่อมต่อ TCP แบบเอกสิทธิ์
  • หากการผูกล้มเหลวด้วย EADDRINUSE การเริ่มต้นจะโยน GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")
  • เมื่อปิดระบบ Gateway จะปิดเซิร์ฟเวอร์ HTTP/WebSocket และลบไฟล์ล็อก

พื้นผิวข้อผิดพลาด

  • หากมีกระบวนการอื่นถือพอร์ตอยู่ การเริ่มต้นจะโยน GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")
  • ความล้มเหลวในการผูกแบบอื่นจะแสดงเป็น GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …")

หมายเหตุด้านการปฏิบัติการ

  • หากพอร์ตถูกใช้โดยกระบวนการ อื่น ข้อผิดพลาดจะเหมือนกัน; ให้ปล่อยพอร์ตหรือเลือกพอร์ตอื่นด้วย openclaw gateway --port <port>
  • ภายใต้ตัวกำกับดูแลบริการ กระบวนการ Gateway ใหม่ที่เห็นตัวตอบกลับ /healthz ที่ยังทำงานปกติอยู่จะปล่อยให้กระบวนการนั้นยังควบคุมต่อไป บน systemd ตัวเริ่มต้นที่ซ้ำกันจะออกด้วยโค้ด 78 เพื่อให้ค่าเริ่มต้น RestartPreventExitStatus=78 หยุด Restart=always ไม่ให้วนซ้ำเมื่อเกิดความขัดแย้งของล็อกหรือ EADDRINUSE หากกระบวนการที่มีอยู่ไม่เคยเข้าสู่สถานะปกติ การลองซ้ำจะถูกจำกัด และการเริ่มต้นจะล้มเหลวด้วยข้อผิดพลาดล็อกที่ชัดเจนแทนที่จะวนซ้ำตลอดไป
  • แอป macOS ยังคงรักษาตัวป้องกัน PID แบบเบาของตัวเองก่อนสร้าง Gateway; ล็อกขณะรันไทม์ถูกบังคับใช้โดยไฟล์ล็อกพร้อมกับการผูก HTTP/WebSocket

ที่เกี่ยวข้อง