Gateway / Operations • 5分で読める
Gateway Lock(ロック)
WebSocket リスナーのバインドによる Gateway の単一実行ガード
Last updated: 2025-12-11
Tutorial.step
なぜ
- 同一ホスト上の同一ベースポートでは Gateway を 1 つだけ動かせるようにします。追加の Gateway は分離された profile とユニークなポートが必要です。
- クラッシュ/SIGKILL でも古いロックファイルを残しません。
- 制御ポートが占有されている場合に、明確なエラーで即座に失敗します。
Tutorial.step
仕組み
- Gateway は起動直後に排他的な TCP リスナーで WebSocket リスナーをバインドします(デフォルト
ws://127.0.0.1:18789)。 - バインドが <code>EADDRINUSE</code> で失敗すると、起動時に <code>GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")</code> を投げます。
- OS はプロセス終了時に(クラッシュや SIGKILL を含め)リスナーを自動解放します。別途ロックファイルやクリーンアップは不要です。
- 終了時は WebSocket サーバーと下層の HTTP サーバーを閉じ、ポートを即時解放します。
Tutorial.step
エラーの表面
- 別プロセスがポートを保持している場合、起動時に <code>GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")</code> を投げます。
- その他のバインド失敗は <code>GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …")</code> として表面化します。
Tutorial.step
運用上の注意
- ポートが別プロセスに占有されている場合も同じエラーになります。ポートを解放するか、<code>openclaw gateway --port <port>'</code> で別のポートを選んでください。
- macOS アプリは Gateway を起動する前に軽量な PID ガードを維持しますが、実行時ロックは WebSocket バインドで強制されます。