CLAUDE_CODE_PROCESS_WRAPPER démarre chaque processus que Claude Code lance à partir de son propre binaire via votre lanceur : le service d’arrière-plan, chaque session qu’il héberge dans la vue agent, et les relanceurs de Claude Code après une mise à jour. Définissez-le sur le chemin absolu de votre lanceur, et Claude Code exécute le lanceur avec la commande Claude Code comme arguments.
Un lanceur qui enveloppe la commande claude sur votre PATH ne peut pas atteindre ces processus, car ils démarrent à partir du chemin direct du binaire sans consulter claude.
CLAUDE_CODE_PROCESS_WRAPPER nécessite Claude Code v2.1.208 ou ultérieur. Les versions antérieures ignorent la variable et démarrent chaque processus sans enveloppe.Ce que le lanceur couvre
AvecCLAUDE_CODE_PROCESS_WRAPPER défini, Claude Code démarre chacun des processus suivants via votre lanceur :
- Le service d’arrière-plan que
claude agentset les sessions d’arrière-plan démarrent à la demande. - L’hôte terminal et la session Claude Code à l’intérieur de chaque ligne de vue agent, y compris les sessions de secours à chaud que le service maintient prêtes.
- Les sessions que le service redémarre après une mise à jour ou un plantage.
- Le relancement que Claude Code effectue de lui-même pour terminer l’installation d’une mise à jour, y compris l’action de redémarrage pour mise à jour de la vue agent.
exec, que Windows ne supporte pas. Une machine Windows avec la variable définie exécute chaque processus sans enveloppe et continue de fonctionner, et le seul signal est un avertissement dans le journal de débogage. Si votre politique de lanceur couvre Windows, la variable ne la satisfait pas là : comptez les machines Windows comme non enveloppées lorsque vous planifiez le déploiement.
Processus qui démarrent en dehors du lanceur
Trois processus ne démarrent jamais via le lanceur :- Un service d’arrière-plan installé :
launchdousystemddémarre ce processus à partir de son fichier d’unité./statusetclaude daemon statusavertissent quand cela s’applique, et les sessions que le service génère démarrent toujours via le lanceur une fois que le service redémarre avec la variable dans ses paramètres. - Une session que vous démarrez vous-même dans un terminal, qui s’exécute comme vous l’avez invoquée. Pour couvrir ces sessions, mettez un script nommé
claudedans un répertoire plus tôt surPATHqui exécute votre lanceur avec le vrai binaire ; ne remplacez pas le lien symbolique géré. Les auto-générations ne consultent pasPATH, donc les deux lanceurs ne s’empilent jamais. - Le premier processus d’un lien profond
claude-cli://, que le gestionnaire de protocole du système d’exploitation démarre directement. Tout ce que cette session démarre en arrière-plan par la suite s’exécute via le lanceur. Pour fermer complètement ce chemin, empêchez l’enregistrement du gestionnaire avec le paramètredisableDeepLinkRegistration.
Noms des processus d’aide dans les moniteurs de processus
Avec un lanceur configuré,ps et Activity Monitor affichent le nom du binaire versionné pour les processus d’aide d’arrière-plan au lieu des étiquettes claude bg-pty-host et claude bg-spare de Claude Code, car le exec du lanceur reconstruit la liste d’arguments. Le renommage est un effet secondaire, pas une dissimulation : les processus sont autrement inchangés, et Claude Code identifie ses propres processus par chemin binaire, jamais par nom d’affichage.
Configurer le lanceur
1
Écrire le script du lanceur
Créez un script exécutable à un chemin absolu, tel que Rendez-le exécutable avec
/opt/corp/launcher. Claude Code l’exécute avec la commande Claude Code complète comme arguments, et le script doit se terminer en appelant exec "$@" pour qu’il se remplace par Claude Code :chmod +x. La partie configuration est tout ce que votre lanceur doit faire avant que Claude Code s’exécute ; le contrat du lanceur ci-dessous énumère les règles que le script doit suivre.Si vous avez précédemment remplacé le lien symbolique
~/.local/bin/claude par votre lanceur, restaurez le lien symbolique d’origine dans le même changement. Un lien symbolique remplacé fait démarrer la première session enveloppée du service d’arrière-plan via les deux lanceurs à la fois, et cela met l’installation dans un état géré en externe : /doctor le signale, la mise à jour automatique laisse le fichier en place, et le nettoyage des anciennes versions reste désactivé jusqu’à ce que l’installateur gère à nouveau ce chemin.2
Définir CLAUDE_CODE_PROCESS_WRAPPER dans les paramètres
Définissez la variable dans le bloc Quand plus d’une source définit la variable, la valeur des paramètres gérés remplace à la fois
env d’un fichier de paramètres pour que le service d’arrière-plan détaché l’hérite. Un export shell n’est pas suffisant : le service d’arrière-plan démarre à la demande, survit à votre shell et ne relit jamais les profils shell.Pour une machine, ajoutez-le à ~/.claude/settings.json. Pour le déployer sur chaque machine de votre organisation, mettez le même bloc dans les paramètres gérés :~/.claude/settings.json et une valeur exportée dans le shell, donc les utilisateurs ne peuvent pas pointer les auto-générations vers un lanceur différent.Les paramètres de projet et locaux ne peuvent pas définir cette variable. Un fichier validé dans un référentiel ne doit pas pouvoir mettre un binaire devant chaque processus Claude Code sur la machine, donc CLAUDE_CODE_PROCESS_WRAPPER dans .claude/settings.json ou .claude/settings.local.json est ignoré, avec un avertissement dans le journal de débogage.3
Redémarrer le service d'arrière-plan et vos sessions
Un service d’arrière-plan en cours d’exécution et toute session
claude ouverte lisent la variable une fois au démarrage, donc ils continuent de lancer des processus sans enveloppe jusqu’au redémarrage. Exécutez claude daemon stop --any pour arrêter le service à la demande ; la commande suivante qui en a besoin, comme claude agents, en démarre un enveloppé. Un service installé prend claude daemon stop sans --any. Ensuite, redémarrez vos sessions claude ouvertes.Sur les machines que vous ne pouvez pas redémarrer manuellement, la première session démarrée après le push des paramètres retire automatiquement un service à la demande sans enveloppe restant. Une machine où aucune nouvelle session ne démarre garde son service sans enveloppe jusqu’à ce qu’une le fasse, et un service installé a toujours besoin du redémarrage dans cette étape.4
Vérifier
Exécutez
/status dans une session : l’entrée Self-exec affiche la commande de lancement résolue et avertit quand le service d’arrière-plan en cours d’exécution ne correspond pas. claude daemon status imprime les mêmes informations depuis le shell, y compris après que vous ayez annulé la variable, quand /status n’affiche plus l’entrée.Le contrat du lanceur
Quand le lanceur ne peut pas s’exécuter, Claude Code refuse de démarrer le processus au lieu de le démarrer sans enveloppe. Sur Windows, la variable est ignorée et les processus démarrent sans enveloppe. Claude Code tient le script à ces règles :- Terminez par
exec "$@". Un lanceur qui crée un enfant et se termine laisse un processus Claude Code orphelin que le service d’arrière-plan ne peut pas suivre. La vue agent marque une telle session comme échouée avec un message nommant le lanceur, et le service récolte ce que le lanceur a laissé derrière. - Ne réordonnez pas, n’absorbez pas et ne préparez pas les arguments. Le premier argument est le binaire Claude Code et tout ce qui suit est son argv.
- Passez chaque variable d’environnement héritée via
exec. Ajouter des variables, comme les credentials injectées, est correct ; supprimer les héritées ne l’est pas.- Les jetons d’authentification par session, la sélection du modèle et du fournisseur, et
CLAUDE_CODE_PROCESS_WRAPPERlui-même voyagent tous sur l’environnement hérité, donc un lanceur qui le reconstruit à partir d’une liste d’autorisation casse les sessions qu’il démarre, et/statussignale une non-correspondance du lanceur. - Si le lanceur doit entrer dans un espace de noms ou un bac à sable qui réinitialise l’environnement, réexportez l’environnement hérité à l’intérieur verbatim.
- Les jetons d’authentification par session, la sélection du modèle et du fournisseur, et
- Atteignez
execen environ trois secondes chaque fois que le lanceur s’exécute. Une expédition d’arrière-plan à froid exécute le lanceur deux fois en série avant le premier octet de sortie, donc faites un travail lent comme un échange d’authentification unique paresseusement ou à partir d’un cache.- Un lanceur qui s’exécute bien au-delà du budget est traité comme un démarrage bloqué et redémarré.
- Tolérez d’être invoqué de l’intérieur de vous-même. Claude Code applique le lanceur à chaque auto-génération imbriquée, donc un lanceur qui acquiert une ressource exclusive doit détecter qu’il la détient déjà.
- N’écrivez pas sur le terminal avant que Claude Code ne démarre. Tout ce qui est imprimé avant le
execest signalé comme la cause du plantage si la session meurt avant l’initialisation.
Format de la valeur CLAUDE_CODE_PROCESS_WRAPPER
Pour la plupart des lanceurs, la valeur est simplement le chemin absolu du script, comme /opt/corp/launcher.
Pour passer à votre lanceur ses propres arguments, écrivez-les après le chemin. Claude Code analyse la valeur comme une liste d’arguments, pas une commande shell :
- L’espace blanc sépare les jetons, et les guillemets doubles groupent un jeton qui contient des espaces.
- Une valeur qui commence par
[est lue comme un tableau de chaînes JSON, comme["/opt/corp/launcher", "--profile", "cc"]. - La syntaxe shell ne fonctionne pas : il n’y a pas d’expansion de variable ou de globbing, et un opérateur non cité comme
;,|,&ou$(est rejeté comme une erreur de configuration plutôt que réinterprété.
Relation avec CLAUDE_CODE_SHELL_PREFIX
CLAUDE_CODE_PROCESS_WRAPPER enveloppe les propres processus de Claude Code et passe la commande via des jetons argv séparés pour que le lanceur exec. CLAUDE_CODE_SHELL_PREFIX enveloppe les commandes shell que Claude Code exécute en votre nom, comme les appels d’outil Bash, les hooks et les commandes qui démarrent les serveurs MCP stdio, et passe chacun comme une seule chaîne entre guillemets shell dans $1 pour que le wrapper la réévalue. Un lanceur écrit pour l’un ne fonctionne pas comme l’autre.
Ressources connexes
- Vue agent : les sessions d’arrière-plan et le processus superviseur que le lanceur couvre
- Variables d’environnement : l’entrée de référence
CLAUDE_CODE_PROCESS_WRAPPER - Paramètres gérés : livrez le bloc
envsur une flotte - Référence d’erreur du lanceur : les messages de refus et comment récupérer