Gateway 鎖定機制
最後更新:2025-12-11
為什麼需要
- 確保同一台主機上每個基底埠只有一個 gateway 實例在運行;額外的 gateway 必須使用獨立的 profile 和專屬埠。
- 即使程序崩潰或被 SIGKILL 強制終止,也不會留下過期的鎖定檔。
- 當控制埠已被佔用時立即失敗,並給出清楚的錯誤訊息。
機制
- Gateway 在啟動時會立即透過獨佔式 TCP 監聽器繫結 WebSocket 監聽器(預設
ws://127.0.0.1:18789)。 - 如果繫結因
EADDRINUSE失敗,啟動時會拋出GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")。 - 作業系統會在程序結束時自動釋放監聽器(包括崩潰和 SIGKILL),不需要另外的鎖定檔或清理步驟。
- 關閉時,gateway 會關閉 WebSocket 伺服器和底層 HTTP 伺服器,迅速釋放埠。
錯誤面
- 如果另一個程序佔用了該埠,啟動時會拋出
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>選擇其他埠。 - macOS 程式在啟動 gateway 前仍會維護自己的輕量 PID 守護機制;執行期鎖定則是由 WebSocket 繫結來強制執行。