2026-04-28 · OpenClaw, launchd KeepAlive, codes de sortie, ThrottleInterval, triage respawn / boucle de crash sur Mac cloud loué sans tête (HK / JP / KR / SG / US)
La plupart des prod OpenClaw sur Mac mini M4 sont derrière SSH uniquement, avec proxy inverse sur 127.0.0.1 et logs JSON suivis via la journalisation structurée. Quand launchd gère la passerelle, le mode défaillance que vous rencontrerez n’est pas un caprice LLM mystérieux : ce sont les redémarrages rapides après sortie — parfois bénins (vous avez demandé à launchd de tout toujours lancer), parfois catastrophiques (mauvaise config, PATH absent, crash avant premier bind). Cette analyse 2026-04-28 relie la pression HTTP fournisseur et la contre-pression webhook au superviseur local : interaction KeepAlive/ThrottleInterval, lignes première panne dans StandardError avec respawns bruyants, quand décharger le LaunchAgent. Complément : variables + launchd et openclaw doctor · allowlist.
Sur un Mac cloud sans tête, launchd est votre init
Pas comme un laptop : personne devant Terminal quand npm ou openclaw gateway sort. Schéma durable : compte service, logs fichier rotatifs, launchd pilote la durée de vie. Erreur 2026 : comparer macOS et Linux systemd mot pour mot ; KeepAlive et RunAtLoad sont musclés mais réclament un throttle — une typo 2 secondes peut générer des milliers de execve/h saturant ~/Library/Logs et le pipe de logs distant. Traitez la sortie de processus comme signal de première classe.
- User LaunchAgents —
~/Library/LaunchAgentspour services long cours par utilisateur ; la plupart des OpenClaw se posent ici en moindre privilège. - System LaunchDaemons — écriture admin, rayon d’impact large ; éviter sauf besoin réel de contexte root.
KeepAlive : quelle « saveur » avez-vous activée ?
La plist KeepAlive peut être booléenne ou un dictionnaire à raisons conditionnelles. Un booléen true est la massue : relancer dès que le process quitte pour n’importe quelle raison, utile au démon 24/7, absurde pour migration one-shot. Subtilités : NetworkState ou chemin devant exister. En debug « pourquoi ça redémarre ? » : ai-je demandé à launchd la survie forcée ou l’application se termine-t-elle alors que sortie ≠ crash ? Dans un monde KeepAlive true, un exit propre peut encore reboucler — comportement vu quand un wrapper se termine alors que l’enfant est détaché.
ThrottleInterval, la massue superviseur ; sinon battement irrégulier → suspectez promesses non gérées ou course sur le bind, pas le LLM.
Chemins StandardOut / StandardError : de vrais fichiers
SSH sans tête n’est pas un TTY : stdio dans le néant perd les 200 ms initiales du crash. Pointez StandardOutPath/StandardErrorPath vers un répertoire écrivable, rotation newsyslog ou cron journalier ; jamais le scrollback interactif comme source. Dans les incidents egress/TLS, un alignement temps entre stdout, accès nginx et JSON passerelle bat un joli tableau Grafana.
ThrottleInterval : frein sur la relance
ThrottleInterval, c’est les secondes minimales après sortie avant qu’un job soit relançable quand launchd pousse les respawns. Mettez 10 au montage pour apaiser les logs, 1–2 au régime quand vous voulez reprendre vite après locks transitoires. Combin avec launchctl print gui/$(id -u)/com.example.openclaw pour lire l’état et la dernière sortie. Documentez-le à l’astreinte (« Throttle=10 ⇒ au mieux une relance/10 s »).
openclaw doctor peut rester vert en boucle crash car le doctor est interactif avec environnement login complet alors que votre plist oublie PATH ou préfixe npm. Comparez toujours env | sort avec la sortie doctor.
Codes de sortie vus réellement en tickets
| Sortie / symptôme | Cause probable OpenClaw | Première action |
|---|---|---|
1 (générique) + une stack stderr |
Parse config, OPENCLAW_ manquant, cwd faux |
Exécutez les mêmes ProgramArguments en SSH avec set -a; source votre.env; set +a suivant le modèle secrets. |
2 depuis wrapper shell |
Options CLI ou quoting de chemins macOS | Argv brut dans wrapper, évitez globs ; vérifiez Node non-Rosetta si arm64 (profiles SSH). |
126/127 |
Fichier non exécutable ou node hors PATH plist |
Chemin absolu + which -a node dans le contexte service. |
| Signal 9 / exit 137 (jargon Linux) — souvent kill simple sous macOS | OOM, kill manuel, watchdog — sur M4, mémoire LLM+gateway | memory pressure Console ou concurrency via shaping fournisseur. |
Triage boucle de crash : six questions avant changer de modèle
- Port utilisé ? passerelle errante ou zombie—voir reverse proxy nginx.
- Boucle avec exit 0 ? un wrapper peut déclencher
KeepAlivesansexec. - stderr identique chaque fois ? une ligne répétée ⇒ config stable ; piles variables ⇒ flake réseau.
- Dernière évolution ? Ancrez tag git / shrinkwrap
npm; culture release aide hors App Store. - 401 en boucle alors que retry court ? circuit breaker, pas encore plus
KeepAlive; 429/503 → quotas LLM. - Throttle placé sur la masse ? Sinon premier patch est souvent
ThrottleInterval.
log stream --style compact --predicate 'process == "openclaw"'; sinon bruit avant signal.
Checklist opérationnelle plist (collage Confluence/Notion)
- Label — DNS inverse unique ; ne réutilisez pas un préfixe
com.d’une autre équipe pour le mêmeUID. - ProgramArguments[0] — chemin complet sans surprises de shells login.
- WorkingDirectory — racine dépôt ; cohérent avec
openclaw doctor. - EnvironmentVariables —
HOME,PATH,NODE_OPTIONSavec doc secrets. - KeepAlive + ThrottleInterval — ne combinez restart agressif et petite limite stderr sans rotation.
plutil -lint ~/Library/LaunchAgents/com.yourorg.openclaw.plist
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.yourorg.openclaw.plist
Sept étapes ops quand « OpenClaw KO à SG »
- Santé edge (nginx)—502 vs 504 = upstream ou passerelle ; DNS/TLS si egress HS.
- Etat launchd—
launchctl printétiquette, dernières sorties, fenêtre throttle. - Logs stables—Throttle si flapping persiste.
- Reproduction interactive même
UIDhorslaunchd. - Diff config + rotation secrets deux personnes.
- Roll forward vers npm connu-non-fantôme.
- Post-mortem synthétique (cause racine, trou de détection, garde).
FAQ : launchd vs passerelle OpenClaw
| Question | Réponse 2026-04-28 |
|---|---|
ProcessType = Interactive ? |
Non en général pour serveur daemon ; Interactive change priorités scheduler. |
caffeinate indispensable ? |
Sur Mac mini M4 24/7 loué dans salle données, sleep souvent coupé stratégiquement ; ne masquez pas bugs de réveil. |
Pourquoi le Mac mini M4 revient encore ici
launchd n’est sérieux que si le métal dessous l’est aussi. Un Mac mini M4 bare-metal HK / JP / KR / SG / US avec 1–2 To permet de traiter mémoirement « OOM passerelle après trop de tool calls » comme problème mesurable ; les équipes lisent alors tarifs par région et accès/support quand le laptop mono-utilisateur étouffe.
Lancez OpenClaw où launchd, journaux et réseau sont alignés
1–2 To · Apple Silicon · SSH / VNC optionnel