KI / Automatisierung 21. Mai 2026

OpenClaw-Gateway launchd-Start auf Mac mini: absoluter Node-Pfad, ProcessType & Exit-78-Fix (2026-05-21)

ProxyMac Engineering-Team 21. Mai 2026 ~18 Min. Lesezeit

Nach einem Neustart bindet Ihr OpenClaw-Gateway-LaunchAgent auf einer gemieteten Mac mini M4 in Hongkong, Japan, Korea, Singapur oder den USA möglicherweise nie den Admin-Port, beendet sich mit Code 78 in launchctl list oder braucht etwa drei Minuten, bis WebSocket-Clients keine abnormalen Schließungen mit 1006 mehr sehen. Dieses Runbook vom 21. Mai 2026 zielt auf launchd-plist-Fehler—ein nacktes node in ProgramArguments und ein fehlendes ProcessType mit Wert Interactive—nicht auf MCP-Waisenprozess-Bäume. Es ergänzt Gateway-Neustart-Wiederherstellung, Headless-SSH-Erststart und Node-Runtime-/nvm-Abgleich.

Exit 78, langsames Listen und WebSocket 1006 nach Kaltstart

Community-Berichte auf Apple-Silicon-Hosts beschreiben zwei unterschiedliche launchd-Fehlerformen. Sofortiger Exit 78 bedeutet, launchd hat Ihre Gateway-Binary nie erfolgreich ausgeführt—oft weil ProgramArguments mit dem String node beginnt, während launchds Umgebung einen leeren oder minimalen PATH hat. Verzögerte Bereitschaft zeigt den Job als „running“ in launchctl list, aber lsof findet minutenlang keinen Listener; Dashboards loggen dann WebSocket-Schließcode 1006, bis der Prozess endlich eingeplant wird. Beides unterscheidet sich von ThrottleInterval-Absturzschleifen, die die CPU mit schnellen Respawns belasten.

  • Exit-Status 78 direkt nach launchctl bootstrap oder Login—~/Library/LaunchAgents/*.plist auf nacktes node prüfen.
  • 180+ Sekunden vom Boot bis zum ersten erfolgreichen Health-Check auf einer sonst idle mini.
  • 1006 am Control-WebSocket, während SSH funktioniert und die Platte gesund ist—Listener noch nicht oben, keine TLS-Fehlkonfiguration.
  • Manuelles node gateway.js per SSH funktioniert, der LaunchAgent-Pfad aber nicht—klassische PATH-vs.-absoluter-Binary-Trennung.
Nicht mit Node-Semver-Drift verwechseln: Wenn node -v zwischen Login-Shell und plist abweicht, zuerst Runtime-Mismatch lesen. Exit 78 heißt „Binary nicht gefunden“; Mismatch heißt „gefunden, aber falsche ABI“.

Warum launchd Ihren Shell-PATH ignoriert und Hintergrund-Agenten zurückstuft

LaunchAgents erben eine abgespeckte Umgebung gegenüber interaktiven Terminal.app-Sitzungen. Dokumentation und Feldthreads betonen, dass EnvironmentVariables in der plist den Interpreter-Namen in ProgramArguments nicht auflösen—launchd löst die ausführbare Datei auf, bevor diese Keys greifen. Deshalb scheitert eine vom Laptop kopierte plist mit node als argv[0] auf headless ProxyMac-Minis, selbst wenn Sie PATH im selben XML exportieren.

Fehlt ProcessType, kann macOS das Gateway als Hintergrundlast behandeln, die nach Neustart Energie- und Planungsheuristiken unterliegt. Operatoren berichten, die Kaltstart-Zeit bis zum Listen schrumpfe von der Größenordnung drei Minuten auf wenige Sekunden nach <key>ProcessType</key><string>Interactive</string> neben Label. Das ist Planungshygiene, kein Freibrief für unbeaufsichtigte GUI-Sitzungen—einmalige Keychain-Arbeit per VNC laut Erststart-Checkliste, danach SSH.

Operator-Matrix (Signal → erster Fix)

Primäres SignalErste Reaktion (Reihenfolge zählt)Belege sichernRollback bei IrrtumVerantwortlich
Letzter Exit-Code 78 am OpenClaw-Labelargv[0] durch absoluten Pfad $(command -v node) ersetzen; bootout → bootstraplaunchctl print gui/$UID/<label> + plist-XMLVorherige plist aus Git wiederherstellenPlattform-SRE
Job läuft, kein Listener >60 s nach NeustartProcessType Interactive ergänzen; ein plist-Label bestätigenZeitgestempeltes lsof -nP -iTCP:<port> -sTCP:LISTENProcessType entfernen, wenn Desktop-Sitzungsrichtlinie es verbietetLeitung Automatisierung
Doppelte Listener am Admin-PortEinzel-Listener-Wiederherstellung folgenZwei PIDs in lsof-AusgabeDoppeltes Label bootoutBereitschaft
Absturzschleife <30 s Takt, hohe CPUThrottleInterval / KeepAlive tunen—nicht dieser Artikellog show --predicate 'process == "launchd"' --last 5mThrottle-Keys zurücksetzenSRE

Neun-Schritte-plist-Fix (SSH auf ProxyMac-mini)

  1. Label identifizieren: launchctl list | grep -i openclaw und den vollen Reverse-DNS-Namen notieren.
  2. Live-Zustand ausgeben: launchctl print gui/$(id -u)/<label> und letzten Exit-Code festhalten.
  3. Node auflösen: im gleichen Benutzerkontext command -v node (oder which node) und absoluten Pfad notieren—typisch unter /opt/homebrew oder ~/.nvm.
  4. plist bearbeiten: argv[0] in ProgramArguments auf diesen Pfad setzen; auch Gateway-Skriptpfad absolut halten.
  5. ProcessType ergänzen: Interactive ins Root-dict einfügen, wenn Kaltstart-Verzögerung zu Feldmeldungen passt.
  6. XML validieren: plutil -lint ~/Library/LaunchAgents/<file>.plist vor Reload.
  7. Recyceln: launchctl bootout gui/$(id -u) <label>, dann bootstrap mit demselben Pfad (oder Vendor-kickstart).
  8. Zeit bis Listen: lsof alle 5 Sekunden für 120 Sekunden; Ziel <15 s auf M4.
  9. Dokumentieren: plist ins Infra-Repo committen; diesen Artikel im Runbook für den nächsten Kollegen verlinken.
Beispiel-ProgramArguments: /opt/homebrew/bin/node + absoluter Pfad zum openclaw-gateway-Einstiegsskript + --config + absolute Config-JSON—nie auf cd in einem Wrapper vertrauen, außer WorkingDirectory ist gesetzt.

Listener, Health-Endpoint und WebSocket-Stabilität prüfen

Nach dem Bootstrap genau eine PID auf Ihrem konfigurierten Admin-Port bestätigen (in der Operator-Dokumentation oft um 18999—an Ihre config.json anpassen). HTTP-Health-Route per curl, falls aktiv; dann Desktop-Client anbinden und innerhalb der ersten 30 Sekunden nach Neustart kein 1006. Health-Check erfolgreich, scheitern aber MCP-Tools, zu MCP-Waisen-Hygiene wechseln statt die Gateway-plist erneut zu bearbeiten.

Einmal pro Quartal Reboot-Test auf Automations-Hosts: launchd-Regressionen zeigen sich oft erst nach macOS-Sicherheitsupdates, nicht bei SSH-Änderungen am selben Tag. uname -r neben Zeit-bis-Listen im Ticketsystem loggen.

Prävention: Plists als Code und Staging-Labels

  • Plists in Git mit absolutem Node-Pfad aus Ihrem Image-Build (Homebrew-Prefix oder nvm-Default).
  • Getrennte LaunchAgent-Labels für Entwicklung/Staging/Produktion auf derselben mini—Neustart-Wiederherstellungs-Leitfaden bei Port-Kollisionen.
  • CI-Smoke: nach Deploy per SSH-Skript Listener <20 s prüfen, bevor der Host als betriebsbereit gilt.
  • Wegwerf-Lab-mini in HK/JP/KR/SG/US für plist-Experimente—günstiger als Debug am Produktions-Orchestrator.

FAQ

Warum beendet sich mein OpenClaw-LaunchAgent sofort mit Code 78? launchd löst ProgramArguments auf, bevor EnvironmentVariables angewendet werden. Ein nackter node-String schlägt fehl, wenn PATH unter launchd leer ist. Ersetzen Sie ihn durch den absoluten Pfad von command -v node, dann bootout und bootstrap der plist erneut.

Warum braucht das Gateway nach einem Neustart Minuten, bis es lauscht? Standard-LaunchAgent-plists lassen ProcessType Interactive oft weg; macOS kann den Hintergrundstart dann minutenlang zurückstufen. ProcessType Interactive im Haupt-dict senkt die Zeit bis zum Listen auf Apple-Silicon-Minis oft von etwa drei Minuten auf wenige Sekunden.

Worin unterscheidet sich das von ThrottleInterval-Absturzschleifen? ThrottleInterval-Probleme zeigen schnelle Respawn-Stürme mit hoher CPU. Exit 78 ist ein einmaliger Konfigurationsfehler, bevor das Gateway läuft. Langsames Listen ohne Absturzschleifen deutet auf ProcessType oder Ressourcenplanung hin—nicht auf KeepAlive, das gegen eine falsche Binary kämpft.

Warum gemietete Mac mini der richtige Ort für harte OpenClaw-launchd-Plists sind

Gateway-plists sind Infrastruktur: Sie müssen Neustart, OS-Updates und Ingenieure überstehen, die nur Laptop-Homebrew-Pfade kennen. Apple Silicon M4-Minis liefern vorhersagbare Kaltstart-Zeiten, macOS launchd passt zum dokumentierten OpenClaw-LaunchAgent-Flow, und Platzierung in HK / JP / KR / SG / US hält die Latenz der Steuerungsebene nah an den APIs, die Sie automatisieren. ProxyMac erlaubt, eine bekannte plist auf einer Staging-mini zu klonen, Sub-Minuten-Listen per SSH zu beweisen und dasselbe XML in Produktion zu übernehmen—Preise für die Region, Hilfe-Center für Zugangsmuster.

launchd-plists auf Staging-Hardware beweisen

Mac mini in HK / JP / KR / SG / US für OpenClaw-Gateway-Härtung mieten