2026-05-15 レンタル ProxyMac Mac mini 上の OpenClaw LaunchAgent:ThrottleInterval、KeepAlive、SuccessfulExit でクラッシュループをモデル障害と見誤らない
香港・日本・韓国・シンガポール・米国 のレンタル Mac mini M4 で OpenClaw を LaunchAgent として常駐させると、典型的にはゲートウェイが終了し、launchd が 1 秒未満で再起動し、推論 API が 429 や空ストリームを返し、チームは「モデルが悪い」と断定します。本稿は運用・プラットフォーム向けに、(1) 対象と定量ゲート、(2) クラッシュループとプロバイダー側スロットルの切り分け、(3) ThrottleInterval・KeepAlive・SuccessfulExit の4 行マトリクス、(4) 再起動復旧 と 開発/ステージング/本番の分離 に沿った9 ステップ手順、(5) HTTP 429 バーストのシナリオ表、(6) ThrottleInterval を 0 にしたときの落とし穴をまとめます。ulimit とメモリ、無人ジョブ、企業 HTTP プロキシの plist 化 と併読してください。SKU は 料金、インシデント雛形は ヘルプ、GUI の一度きりの信頼ダイアログは VNC を利用します。
OpenClaw で ThrottleInterval と KeepAlive を必ず調整すべきケース
ゲートウェイがモデル品質とは無関係に終了する—壊れた設定 JSON、MCP 子プロセスのセグフォ、TLS MITM の CA ローテ、デプロイ途中で token ファイルが一瞬消える—といったフリートでは plist を点検します。ThrottleInterval を明示しないと、macOS は SSH で人間が再試行するより速い自動再起動を許しがちです。逆に KeepAlive だけを有効にし終了セマンティクスを書かないと、「成功した」メンテ停止ですぐに再起動されることがあります。
- 定量ゲート:
log show --predicate 'process == "launchd"' --last 15mで同一 Label の起動が 12 回を超えたらクラッシュループ領域です。 - プロバイダーゲート:429 が再起動タイムスタンプと ±5 秒 で相関するなら、まず自動再起動を遅らせ、温度調整は後回しにします。
- 分離ゲート:複数環境で plist Label を共有しない—スロットル変更前に 分離ガイド の一環境一 Label を徹底します。
症状:クラッシュループとプロバイダー側スロットル
クラッシュループは CPU ののこぎりが典型で、0% のアイドルから約 8 秒で 180% まで立ち上がり、ハード終了を繰り返します。プロバイダー側の制限は CPU が比較的平坦で、retry-after や指数バックオフのヒントがログに現れます。JSONL の先頭バナーが多数のファイルで同一なら、プロセスが定常状態に入っていない可能性が高いです。ベンダーにチケットを切る前に、stat -f '%m' ~/Library/LaunchAgents/com.example.openclaw.plist で plist の更新時刻を揃え、JSONL 診断 と突き合わせてください。
launchctl print の最終終了ステータス、(2)ゲートウェイログの HTTP ステータスヒストグラム、(3)MCP 子の終了コード—MCP が安定し HTTP が 429 主体なら、まず自動再起動を遅らせます。
意思決定マトリクス:ThrottleInterval・KeepAlive・SuccessfulExit
| キー | 制御内容 | 上げる/有効化するタイミング | 誤設定の主なリスク |
|---|---|---|---|
ThrottleInterval(秒) |
終了後の自動再起動の最短間隔 | 429 嵐やロールアウト中の不安定 MCP | 大きすぎると障害時の実回復が見えにくい |
KeepAlive true |
ジョブ終了時の自動再起動(plist セマンティクスに従う) | 再起動後も常駐すべき長寿命ゲートウェイ | スロットルなしだと枠を焼き尽くす |
SuccessfulExit false |
KeepAlive と組み合わせ、終了 0 を自動再起動しない成功として扱う | メンテ用のセンチネルスクリプト | ブールを逆にするとゾンビ再起動が残る |
手動 launchctl kickstart -k |
運用者主導の再起動でスロットル周期をバイパス | plist 検証後の制御されたリリース | 自動化が kickstart をタイトループすると嵐が再現する |
9 ステップ安定化手順
- Label 監査:本番 OpenClaw は 1 plist のみ、環境分離 に従います。
- 終了嵐の取得:Label でフィルタした unified log の直近 200 行をエクスポートします。
- ベーススロットル:開発は 10 秒から、本番は初回 429 クラスタ後に 30 秒へ引き上げます。
- SuccessfulExit の定義:アップグレードスクリプトで終了 0 をグレースフルとして文書化します。
- メモリ上限の整合:ulimit 記事 と揃え、OOM をネット障害に見せかけないようにします。
- Webhook の抑制:Slack Webhook 利用時は、スロットルがプロセスを冷却している間はアラートをデバウンスします。
- 故障注入:秘密でない設定ファイルを一時的に退避し、再起動間隔が ThrottleInterval を守るか確認します。
- ソーク:ピーク並列の 40% で 45 分の合成トラフィックを流し、隠れた外部ウォッチドッグが二重起動しないか見ます。
- ポストモーテム:plist の diff と再起動ヒストグラムを 設定バージョン管理 と同じ Git に保存します。
ThrottleInterval を 0 にしないでください—あなたのクラッシュが全員のレート制限事故になります。
シナリオ表:HTTP 429 バーストと launchd の挙動
| シナリオ | 観測パターン | 最初のレバー |
|---|---|---|
| MCP セグフォループ | 終了コード 139 が 2〜4 秒周期 | ThrottleInterval を 30 に上げ、MCP パスを修正 |
| デプロイ中の token ファイル競合 | 6 回の終了 78 の後に成功 | デプロイ用ミューテックス追加、ThrottleInterval ≥ 15 |
| プロバイダー全体スロットル | 429 と Retry-After: 60 |
ThrottleInterval ≥ 60、並列エージェント削減 |
運用 kickstart -k スクリプトの不具合 |
健全でも 60 秒ごとに起動 | cron ラッパーを外し、KeepAlive + ヘルスプローブへ |
落とし穴:ThrottleInterval がゼロと二重ウォッチドッグ
対話型デーモン向けテンプレからコピーした plist は ThrottleInterval が 0 のまま残りがちです。OpenClaw に攻撃的な KeepAlive を重ねると、サブ秒でファイル記述子が枯れ、MCP の 24 系エラーとして現れます(ツール本体の欠陥ではありません)。もう一つは、KeepAlive が true のまま外部 cron が launchctl kickstart を定期実行するパターンで、健全時に二重起動します。監督レイヤは一つに絞ります。
defaults read /path/to.plist ThrottleInterval
FAQ
ThrottleInterval は通常デプロイを遅らせますか?終了後の自動再開の最短間隔だけを制約します。運用者が launchctl kickstart で手動再起動する場合はスロットル対象外です。
カナリア中は KeepAlive を true にすべきですか?常駐ゲートウェイでは多くの場合 true ですが、ThrottleInterval と併用し不良バイナリの瞬間再起動を防ぎます。カナリア用は別 Label の plist にします。
メンテ停止に SuccessfulExit で書くべき終了コードは?ラッパーが約束するセンチネル—多くは 0 がグレースフル—を plist 横に文書化し、障害時の終了シグネチャと混同しないようにします。
なぜ ProxyMac Mac mini で launchd の再起動規律を稽古すべきか
レンタル Mac mini M4 は予測可能なシングルテナント CPU で熱スロットルと再起動嵐を切り分けやすく、開発者ノートと同じネイティブ macOS の syslog 挙動を得られます。HK / JP / KR / SG / US のリージョン選択で、遅延実験を実ユーザー分布に近づけられます。ここでスロットル算を検証したら、同じ plist 断片を 料金 が透明な第二台 mini へ昇格させ、launchd セマンティクスが隠れる共有 CI Runner で推測する必要はありません。
枠に触れる前に OpenClaw launchd を硬化
ThrottleInterval · KeepAlive · HK / JP / KR / SG / US