docs/docs/th/gateway/gateway-lock.md
2026-04-30 16:33:04 +00:00

5.4 KiB

read_when summary title x-i18n
การเรียกใช้หรือดีบักโปรเซส Gateway
การตรวจสอบการบังคับใช้ให้มีอินสแตนซ์เดียว
ตัวป้องกันซิงเกิลตันของ Gateway โดยใช้การผูกตัวรับฟัง WebSocket การล็อก Gateway
generated_at model provider source_hash source_path workflow
2026-04-30T16:29:02Z gpt-5.5 openai 85a1cb55f08d47d36fde25900e4247ef01c9a6800bf017fbff44a337f299ce13 gateway/gateway-lock.md 16

เหตุผล

  • ตรวจสอบให้แน่ใจว่ามี 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

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