Gateway

再起動からの復旧

Gatewayを再起動しても、エージェントの状態は失われません。会話、トランスクリプト、 スケジュール済みジョブ、バックグラウンドタスクの記録、キューに入った送信メッセージは すべてディスク上に保存されており、ターンの途中で中断された処理はGatewayの再起動後に 自動的に検出され、再開されます。手動での介入は不要で、設定するものもありません。 復旧は常に有効です。

このページでは、再起動後も保持されるもの、中断された処理の検出方法、 自動再開がどのように行われるかについて説明します。

再起動後も保持されるもの

状態 ストレージ 再起動時の動作
会話履歴 JSONLトランスクリプト + ディスク上のエージェント別セッションストア 変更されず、セッションは保存済みトランスクリプトから継続される
中断されたメインセッションのターン セッションストア内の復旧マーカー 起動から数秒後に自動的に再開される
サブエージェントの実行 SQLite(共有状態データベース) 起動時にレジストリが復元され、中断された実行が再開される
バックグラウンドタスク SQLite(共有状態データベース) 起動時に照合され、孤立した実行は復旧されるか消失としてマークされる
キューに入った送信処理 SQLite配信キュー 再起動後に処理され、未配信の応答は再試行される
スケジュール済み(cron)ジョブ SQLite cronストア スケジュールは保持され、起動時にスケジューラーが再設定される
再起動後の継続処理 SQLite再起動センチネル 再起動を要求したセッションに1回限りのフォローアップが送られる

グレースフル再起動では先に処理の完了を待機する

要求された再起動(openclaw gateway restart、再起動が必要な設定変更、 またはGatewayの更新)では、実行中の処理は即座に強制終了されません。Gatewayは 新しい処理の受け付けを停止した後、アクティブなエージェントのターンと バックグラウンドタスクが完了するまで、ドレイン予算(デフォルトでは5分)の範囲内で 待機します。そのため、ほとんどの再起動では処理はまったく中断されません。

ドレイン予算内に完了できない処理(または強制再起動やクラッシュによって中断された実行) だけが中止されます。その前に、影響を受ける各セッションには復旧用のマーカーが付けられます。

中断された処理の検出方法

ターンが完了しなかったセッションは、相互に補完する2つの仕組みによってマークされます。

  • シャットダウン時: 再起動時のドレイン中に、アクティブな実行があるすべての セッションについて、実行を中止する前にセッションストアへ復旧マーカーが記録されます。
  • 起動時: Gatewayはセッションストアをスキャンし、実行中であると記録されているものの、 新しいプロセス内に稼働中の所有者が存在しないセッションを検出します。これにより、 シャットダウンコードが実行されなかったハードクラッシュや強制終了も検出できます。 古くなったトランスクリプトのロックファイルも同時に削除されます。

自動再開

起動から数秒後、Gatewayはマークされた各セッションを、前回のターンが再起動によって 中断されたことと、既存のトランスクリプトから処理を続行するようエージェントに伝える 合成システムメッセージとともに再ディスパッチします。最終応答がすでに生成されているものの 未配信だった場合は、そのテキストも含められるため、エージェントは処理をやり直さずに 配信できます。復旧は指数バックオフを使用して最大3回再試行されます。

再開する前に、Gatewayはトランスクリプトの末尾から安全に続行できることを確認します。 安全でない場合(たとえば、ターンが古い保留中の承認で終了していた場合)は、 セッションを無条件に再実行しません。代わりに、エージェントが最後のリクエストを 再送するようユーザーに求める短い通知を投稿します。

OpenClawは、中断された読み取り専用のCode Mode処理も 再構築できます。Code Modeはこれらの実行を再起動安全としてマークし、副作用を伴う カタログツールやPlugin名前空間については、実行前に拒否します。再起動がwait 制御中に発生した場合、新しいGatewayはトランスクリプトからターンを再構築し、 モデルがそのフラグを省略または解除しても、再構築された実行を強制的に再起動安全な状態に 維持します。ホストは、再起動後にCode Modeが無効化された場合も含め、 再構築されたターン全体を、監査済みの読み取り専用コアツールと明示的に再実行安全な Pluginツールに限定します。副作用を伴う処理については、書き込みが重複するリスクを 冒すのではなく、引き続き再送通知によって保護されます。

サブエージェント

サブエージェントの実行は共有SQLite状態データベースに永続化されるため、 サブエージェントレジストリはプロセス終了後も保持されます。起動時にレジストリが復元され、 中断されたサブエージェントセッションは元のタスクコンテキストとともに再開されます。 次の2つの安全策が適用されます。

  • 2時間より前に中断された実行は再開されずに完了扱いとなるため、 Gatewayが一晩停止していた場合でも古い処理が復活することはありません。
  • 復旧に繰り返し失敗するセッションは停止状態としてトゥームストーン化されるため、 復旧処理が永久にループすることはありません。

バックグラウンドタスク

バックグラウンドタスクレジストリはSQLiteを基盤としており、 起動時および定期的な間隔で照合されます。完了した実行によって記録された永続的な結果は 復旧され、所有プロセスが消失した実行は永久に停止したままにならないよう、 猶予期間の経過後に消失としてマークされます。

エージェントが要求した再起動

エージェント自身が再起動をトリガーした場合(設定変更の適用、Gatewayの更新、 または明示的な再起動要求)、プロセスが終了する前に再起動センチネルがSQLiteへ 書き込まれます。起動後、Gatewayは結果を元のチャットへ投稿し、1回限りの継続ターンを ディスパッチします。これにより、エージェントは同じチャンネルとスレッドで、 中断した箇所から正確に処理を再開します。

安全策と可観測性

  • クラッシュループブレーカー: 5分以内にクリーンでない起動が3回発生すると ブレーカーが作動し、次回の起動時に補助サービスの自動起動を抑止します。これにより、 クラッシュするGatewayが障害を増幅することを防ぎます。クリーンでない起動の 判定期間が経過すると復旧します。
  • メトリクス: 復旧アクティビティはPrometheusを通じて openclaw_session_recovery_totalおよび openclaw_session_recovery_age_secondsとしてエクスポートされます。
  • ログ: 復旧に関する判断は、main-session-restart-recoveryおよび subagent-interrupted-resumeサブシステムに記録されます。

再開されないもの

  • 別の所有者がすでに処理しているため、メインセッションの復旧対象から除外される セッション:サブエージェントセッション(サブエージェントによる復旧)、 cronセッション(スケジューラーがスケジュールに従って再実行)、 ACP管理セッション(接続中のIDEまたはクライアントが再開を管理)。
  • トランスクリプトの末尾から安全に続行できないセッション。これらは黙って再実行されず、 前述の再送通知を受け取ります。
  • 一度も受け付けられなかった処理。ドレイン期間中に到着したメッセージは、 終了中のプロセスへ黙ってキューイングされるのではなく、明示的な再起動エラーで 拒否されます。
Was this useful?
On this page

On this page