AI / 自動化 2026年5月21日

レンタル Mac mini で OpenClaw ゲートウェイ launchd 起動:node 絶対パス・ProcessType・終了コード 78(2026-05-21)

ProxyMac エンジニアリングチーム 2026年5月21日 約 18 分

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 失敗—ProgramArgumentsnode で始まり launchd 側 PATH が空なケースが典型です。起動遅延launchctl list では実行中なのに lsof で数分 LISTEN が無く、WebSocket が 1006 のまま—スケジュールされるまで続きます。いずれも CPU を叩く ThrottleInterval クラッシュループ とは別物です。

  • 終了状態 78launchctl bootstrap 直後やログイン後—~/Library/LaunchAgents/*.plist の裸 node を確認。
  • 180 秒超:アイドル mini で起動から初回ヘルス成功までが長すぎる。
  • 1006:SSH・ディスクは正常なのに制御 WebSocket だけ落ちる—まだ LISTEN していない。
  • SSH で手動 node gateway.js は成功、LaunchAgent だけ失敗—PATH と絶対パスの分裂。
Node セマンティクス漂移と混同しない: ログイン shell と plist で node -v が違うなら先に ランタイム不一致。78 は「バイナリ未検出」、不一致は「検出したが ABI が違う」。

launchd が shell PATH を無視しバックグラウンド Agent を低優先度にする理由

LaunchAgent の環境は Terminal より薄い。plist の EnvironmentVariablesProgramArguments 内のインタプリタ名解決に効かない—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 → bootstraplaunchctl print gui/$UID/<label> + plistgit から旧 plist 復元プラットフォーム SRE
実行中だが再起動後 >60 秒 LISTEN なしProcessType Interactive 追加;label 単一化タイムスタンプ付き lsofポリシー上 NG なら ProcessType 削除自動化リード
管理ポート二重 LISTEN単一 LISTEN 復旧lsof で PID が 2 つ重複 label を bootoutオンコール
<30 秒周期クラッシュ・高 CPUThrottleInterval / KeepAlive 調整(本稿外)log show 5 分throttle キー戻しSRE

9 ステップ plist 修正(ProxyMac mini SSH)

  1. label 特定: launchctl list | grep -i openclaw
  2. 現状態出力: launchctl print gui/$(id -u)/<label>、終了コードを保存。
  3. Node 解決: 同一ユーザーで command -v node
  4. plist 編集: argv[0] とゲートウェイスクリプトを絶対パスに。
  5. ProcessType 追加: 冷起動遅延が現場と一致すれば Interactive。
  6. XML 検証: plutil -lint
  7. 再読込: bootout → bootstrap(または kickstart)。
  8. time-to-listen: 5 秒間隔で 120 秒 lsof;M4 で <15 秒目標。
  9. 文書化: plist を infra git に;runbook へ本稿リンク。
ProgramArguments 例: /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 ゲートウェイ起動を固める