OpenClaw launchd:ThrottleInterval・KeepAlive・ヘルスプローブ——2026 レンタル Mac mini マトリクス
VmMac で借りた Apple Silicon Mac mini 上の LaunchAgent で OpenClaw を動かすと、ThrottleInterval がクラッシュループを隠し、KeepAlive が不調プロセスを蘇らせ、SuccessfulExit の意味が Node ゲートウェイのアップグレード時の終了コードと噛み合わない、という三すくみに出会います。本稿は 2026 年の実務マトリクスとして、安全な組み合わせ、誤検知による再起動嵐、VNC 無しでも使えるヘルスチェック、香港・日本・韓国・シンガポール・アメリカでの観測項目の揃え方を整理します。ゲートウェイ復旧、ステージングと本番の分離、構造化ログとディスクローテとセットで読むと、plist 調整が勘頼みになりません。
初期導線は インストールとデプロイ、アクセス手順は ヘルプ、カナリア用にホストを増やす判断は 料金 を参照してください。
なぜ launchd ポリシーが Node のバージョンより重要か
OpenClaw のセマンティックバージョンを完璧に固定しても、ヘルスプローブが LLM の遅延を死と誤認して launchd が 12 秒周期で再起動すれば意味がありません。plist の各キーは SLA の一部です。VmMac にはハイパーバイザの監督者がいないので、launchd が監督者です。
Node ゲートウェイはシグナル契約も守る必要があります。デプロイ時の SIGTERM で HTTP を閉じ、構造化ログをフラッシュし、SIGKILL 前に終了できなければ、対話シェルでは「手動再起動は常に成功」し、エージェント経路だけ不安定に見えます。README に期待シグナル順を明記し、捨てられるミニでリハーサルしてから本番 plist を触ってください。
ThrottleInterval はバグ修正の代替ではありません。OS レベルのバックオフとアプリ側サーキットブレーカーを併用し、壊れた設定が全リージョンで CPU を焼くのを防ぎます。
- ThrottleInterval:再起動頻度を抑えるが、慢性の部分障害を隠す。
- KeepAlive:常駐に有利だが計画停止を難しくする。
- ExitTimeOut:グレースフル終了の猶予、その後 SIGKILL。
マトリクス:ThrottleInterval / KeepAlive / ExitTimeOut
| 目的 | 主なつまみ | リスク | 緩和 |
|---|---|---|---|
| クラッシュループ停止 | ThrottleInterval ≥ 30s | 本物のクラッシュ後の復旧が遅い | 終了コードで外部ページ |
| 常時オン GW | KeepAlive true + SuccessfulExit false | 意図停止でも復活 | メンテ専用ラベルを分離 |
| グレースドレイン | ExitTimeOut 25–40s | ハングした終了が再起動を塞ぐ | 予算後のウォッチドッグ SIGKILL |
| 再起動サンダリングヘルド抑制 | カレンダー分散やラッパ sleep | ピアより遅いレディネス | 依存待ちのヘルスゲート |
同一ユーザーセッションに他の launchd ジョブがいるなら Nice や LowPriorityIO でログシッパーがイベントループを飢えさせないようにします。容量計画の代替ではありませんが、局所障害の数分は稼げます。
誤検知再起動嵐:兆候と原因
ローカルヘルスがソケットバインド前に叩かれる、ディスク圧でモジュール読込が遅延する、といったパターンが典型です。Spotlight/mds が冷起動を伸ばしてタイムアウトするケースでは、先に インデックス方針 を疑ってください。
外部 SaaS を先に見るプローブは、日本やシンガポールの経路揺らぎで健全なプロセスを殺します。ループバックを先に、外部カナリアは緩いタイムアウトで任意層に分けてください。ディスク満杯では JSONL が ENOSPC で落ち、KeepAlive が即再起動しログも即死します—ログローテとクォータを先に揃えます。
ヘッドレス・ヘルスプローブ
ループバック向けに限り TLS 検証を切る curl ラッパでも、CLI の status サブコマンドでも構いません。HTTP ステータス、TLS ハンドシェイク ms、PID をログし、「生きているが固まった」と「死んだ」を分けます。
X-Probe-Trace-Id を付けてゲートウェイ側で返すと、プローブ失敗と遅いクエリを縫い合わせられます。
curl -fsS --max-time 3 http://127.0.0.1:18789/health || exit 1
2026 八段階チューニング
- plist を変える前に 7 日間の終了コード基線。
- 20 秒未満の再起動リズムを潰す ThrottleInterval。
- ExitTimeOut を文書化 SLA に合わせる。
- 再起動理由を構造化ログへ。
- 単一リージョンで 72h カナリア。
- HK/JP/KR/SG/US の再起動数比較。
- git タグ
launchd-YYYYMMDDでロールバック plist を固定。 - 四半期ごとに kill -9 復旧演習。
ステップ 4 と 5 の間はメトリクスが緑でも機能開発を止め、週末トラフィック形での嵐を観察してください。
ゲートウェイ復旧ドキュメントとの接続
復旧記事は「何を再起動するか」、本稿は「OS がいつ自動再起動するか」です。数値が食い違うと人は kill -9 癖に落ちます。ステージングと本番で同じ数値を保ち、昇格は diff で行けるようにしてください。
観測テーブル:再起動ごとに残すフィールド
| フィールド | 目的 |
|---|---|
launchd_exit_status |
OOM と正常終了の切り分け |
uptime_s |
幼児死亡率ループ |
rss_mb |
SIGKILL 前のリーク相関 |
fds_open |
KeepAlive が増幅する FD 漏れ |
last_http_5xx_ts |
上流 5xx とローカル死の分離 |
JSON Lines をリクエストログと同じシンクへ。フィールド名は五リージョンで揃えるのが先、完璧な基数は後で構いません。
FAQ
LaunchDaemon にすべき? セキュリティレビュー付きでなければ避ける—エージェントの TCC 境界は意図的かもしれません。
リージョンごとに数値を変える? 文書化された例外以外は揃えるのが既定。
npm 大移行中は? 一時的に ThrottleInterval を広げる。
SuccessfulExit false は常に再起動? 実質そう—ドレイン完了とクラッシュを終了コードで分ける。
プローブは root? ゲートウェイと同一ユーザーが無難。
計画メンテの沈黙? メンテフラグをラッパが見て自動失効させる。
Mac mini M4 と VmMac が常時オン GW に合う理由
十分な持続性能とユニファイドメモリで OOM 揺れが減り、攻撃的プローブに冷起動で負けにくいです。五リージョンに置き、第二台で plist カナリアを回せば本番の再起動意味論を壊しません。
レンタルは macOS セキュリティパッチ後の挙動差分を、非本番ミニで plist マトリクスをリプレイ検証しやすくします。深夜ページより安い保険です。
最後に、launchd の変更は「アプリの設定変更」と同列の変更管理に載せてください。承認フローとロールバック手順が無いと、どんなに良い数値でも現場では守られません。