レンタル Mac mini で OpenClaw ゲートウェイ launchd 起動:node 絶対パス・ProcessType・終了コード 78(2026-05-21)
ProxyMac でレンタルした Mac mini M4(香港・日本・韓国・シンガポール・米国)上の OpenClaw ゲートウェイ LaunchAgent は、再起動後に管理ポートが LISTEN しない、launchctl list で終了コード 78、または冷起動後 約 3 分 WebSocket が 1006 で落ち続けることがあります。本稿(2026-05-21)は launchd plist の誤設定—ProgramArguments の裸 node と欠落した ProcessType Interactive—に焦点を当て、MCP 孤児プロセスではありません。ゲートウェイ再起動復旧、ヘッドレス SSH 初回起動、Node ランタイム / nvm 整合 と併読してください。
冷起動:終了コード 78、遅い LISTEN、WebSocket 1006
Apple Silicon 現場では launchd 障害が二系統に分かれます。即時の 78 はゲートウェイバイナリの exec 失敗—ProgramArguments が node で始まり launchd 側 PATH が空なケースが典型です。起動遅延 は launchctl list では実行中なのに lsof で数分 LISTEN が無く、WebSocket が 1006 のまま—スケジュールされるまで続きます。いずれも CPU を叩く ThrottleInterval クラッシュループ とは別物です。
- 終了状態 78:
launchctl bootstrap直後やログイン後—~/Library/LaunchAgents/*.plistの裸nodeを確認。 - 180 秒超:アイドル mini で起動から初回ヘルス成功までが長すぎる。
- 1006:SSH・ディスクは正常なのに制御 WebSocket だけ落ちる—まだ LISTEN していない。
- SSH で手動
node gateway.jsは成功、LaunchAgent だけ失敗—PATH と絶対パスの分裂。
node -v が違うなら先に ランタイム不一致。78 は「バイナリ未検出」、不一致は「検出したが ABI が違う」。
launchd が shell PATH を無視しバックグラウンド Agent を低優先度にする理由
LaunchAgent の環境は Terminal より薄い。plist の EnvironmentVariables は ProgramArguments 内のインタプリタ名解決に効かない—launchd は先に実行ファイルを解決します。だからノート PC の plist をヘッドレス mini にコピーしても、XML に PATH があっても argv[0]=node は失敗します。
ProcessType 省略時、再起動後にゲートウェイがバックグラウンド負荷扱いになり得ます。Label 横に Interactive を入れると、LISTEN までが 約 3 分 から数秒に短縮した例が多いです。無人 GUI の許可ではなくスケジューリング衛生—Keychain は 初回起動 で VNC、日常は SSH。
オペレーター表(信号 → 最初の手当)
| 主要信号 | 最初の対応(順序重要) | 取得すべき証拠 | 誤操作時の戻し | 担当 |
|---|---|---|---|---|
| OpenClaw ラベルが 78 で終了 | argv[0] を $(command -v node) の絶対パスに;bootout → bootstrap | launchctl print gui/$UID/<label> + plist | git から旧 plist 復元 | プラットフォーム SRE |
| 実行中だが再起動後 >60 秒 LISTEN なし | ProcessType Interactive 追加;label 単一化 | タイムスタンプ付き lsof | ポリシー上 NG なら ProcessType 削除 | 自動化リード |
| 管理ポート二重 LISTEN | 単一 LISTEN 復旧 | lsof で PID が 2 つ | 重複 label を bootout | オンコール |
| <30 秒周期クラッシュ・高 CPU | ThrottleInterval / KeepAlive 調整(本稿外) | log show 5 分 | throttle キー戻し | SRE |
9 ステップ plist 修正(ProxyMac mini SSH)
- label 特定:
launchctl list | grep -i openclaw - 現状態出力:
launchctl print gui/$(id -u)/<label>、終了コードを保存。 - Node 解決: 同一ユーザーで
command -v node。 - plist 編集: argv[0] とゲートウェイスクリプトを絶対パスに。
- ProcessType 追加: 冷起動遅延が現場と一致すれば Interactive。
- XML 検証:
plutil -lint。 - 再読込: bootout → bootstrap(または kickstart)。
- time-to-listen: 5 秒間隔で 120 秒
lsof;M4 で <15 秒目標。 - 文書化: plist を infra git に;runbook へ本稿リンク。
/opt/homebrew/bin/node + エントリ絶対パス + --config + JSON 絶対パス—WorkingDirectory 無しで wrapper の cd に依存しない。
LISTEN・ヘルス・WebSocket の確認
bootstrap 後、管理ポート(ドキュメントでは 18999 が多い—config.json に合わせる)で LISTEN は 1 PID のみ。HTTP ヘルスがあれば curl;再起動後 30 秒以内に 1006 なし。ヘルス OK で MCP だけ失敗なら MCP 孤児衛生 へ—ゲートウェイ plist をいじり続けない。
四半期に一度の再起動テストを推奨—launchd 退行は macOS セキュリティ更新後に出やすい。チケットに uname -r と time-to-listen を併記。
予防:plist の IaC と staging label
- plist を git 管理—Node 絶対パスはイメージビルドでテンプレート化。
- dev/staging/prod で label 分離—ポート衝突は復旧記事参照。
- CI スモーク: デプロイ後 SSH で <20 秒 LISTEN を断言。
- HK/JP/KR/SG/US の使い捨て lab mini で plist 実験。
FAQ
LaunchAgent が即 78 で落ちる? launchd は EnvironmentVariables より先に ProgramArguments を解決。裸 node は PATH 空で失敗。command -v node の絶対パスへ置換し bootout → bootstrap。
再起動後 LISTEN まで数分? ProcessType Interactive 欠落でバックグラウンド起動が遅れる。追加で約 3 分→数秒の例が多い。
ThrottleInterval ループとの違い? 後者は高 CPU の短周期再起動。78 は実行前の一回設定ミス。クラッシュ無しで LISTEN 遅いなら ProcessType/スケジューリング。
レンタル Mac mini で OpenClaw launchd を固める理由
ゲートウェイ plist はインフラ—再起動・OS 更新・Homebrew パスだけ知るメンバーに耐える必要があります。Apple Silicon M4 の冷起動は予測しやすく、macOS launchd は OpenClaw の LaunchAgent 手順と一致、HK/JP/KR/SG/US で制御面を API 近くに。staging で検証済み plist を SSH で sub-minute LISTEN 確認後に本番へ—料金・ヘルプ。
staging で launchd plist を検証
HK/JP/KR/SG/US の Mac mini で OpenClaw ゲートウェイ起動を固める