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

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

- [Gateway หลายรายการ](/th/gateway/multiple-gateways) — การรันหลายอินสแตนซ์ด้วยพอร์ตที่ไม่ซ้ำกัน
- [การแก้ไขปัญหา](/th/gateway/troubleshooting) — การวินิจฉัย `EADDRINUSE` และความขัดแย้งของพอร์ต
