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
ที่เกี่ยวข้อง
- Gateway หลายรายการ — การรันหลายอินสแตนซ์ด้วยพอร์ตที่ไม่ซ้ำกัน
- การแก้ไขปัญหา — การวินิจฉัย
EADDRINUSEและความขัดแย้งของพอร์ต