Запуск Claude Code через корпоративный launcher
Маршрутизируйте процессы, которые Claude Code запускает из собственного бинарного файла, включая фоновый сервис и каждый сеанс agent view, через требуемый launcher с помощью CLAUDE_CODE_PROCESS_WRAPPER или параметра processWrapper.
Некоторые организации требуют, чтобы каждый процесс на рабочей станции запускался через обязательный launcher. Launcher применяет sandbox, сетевые элементы управления или внедрение учетных данных, от которых зависит позиция безопасности компании, и бинарный файл, который запускается без него, является нарушением политики.
CLAUDE_CODE_PROCESS_WRAPPER запускает каждый процесс, который Claude Code запускает из собственного бинарного файла, через ваш launcher: фоновый сервис, каждый сеанс, который он размещает в agent view, и перезапуски Claude Code после обновления. Установите его на абсолютный путь вашего launcher, и Claude Code запустит launcher с командой Claude Code в качестве его аргументов.
Launcher, который оборачивает команду claude в вашем PATH, не может достичь эти процессы, потому что они запускаются из прямого пути бинарного файла без поиска claude.
CLAUDE_CODE_PROCESS_WRAPPER требует Claude Code v2.1.208 или более поздней версии. Более ранние версии игнорируют переменную и запускают каждый процесс без обертки. Эквивалентный параметр processWrapper требует v2.1.210 или более поздней версии. Более ранние версии игнорируют его как неизвестный ключ, не применяют launcher и не сообщают об ошибке.
После развертывания любой из форм используйте шаг проверки для подтверждения того, что запущенная версия применяет его.
Что охватывает launcher
С установленным CLAUDE_CODE_PROCESS_WRAPPER Claude Code запускает каждый из следующих процессов через ваш launcher:
- Фоновый сервис, который запускают
claude agentsи фоновые сеансы по требованию. - Хост терминала и сеанс Claude Code внутри каждой строки agent view, включая теплые резервные сеансы, которые сервис держит в готовности.
- Сеансы, которые сервис перезапускает после обновления или сбоя.
- Перезапуск, который Claude Code выполняет сам по себе, чтобы завершить установку обновления, включая действие restart-for-update в agent view.
- Процессы сеансов, которые запускает Remote Control. Требуется Claude Code v2.1.210 или позже.
- Сеансы товарищей в разделенной панели, которые запускает agent teams в tmux или iTerm2. Панели товарищей являются интерактивными, а не фоновыми процессами, но Claude Code запускает их из своего собственного бинарного файла, поэтому launcher охватывает их. Требуется Claude Code v2.1.210 или позже.
На Windows переменная игнорируется: контракт launcher зависит от exec, который Windows не поддерживает. Машина Windows с установленной переменной запускает каждый процесс без обертки и продолжает работать, и единственный сигнал — это предупреждение в debug log. Если ваша политика launcher охватывает Windows, переменная не удовлетворяет ее там: при планировании развертывания считайте машины Windows как без обертки.
Процессы, которые запускаются вне launcher
Следующие процессы не запускаются через launcher:
- Установленный фоновый сервис, чей unit был написан до того, как был настроен launcher:
launchdилиsystemdзапускает этот процесс из его файла unit./statusиclaude daemon statusпредупреждают, когда запущенный сервис и настроенный launcher не совпадают, и сеансы, которые запускает сервис, все еще запускаются через launcher после перезагрузки сервиса с переменной в его параметрах. - Сеанс, который вы запускаете сами в терминале, который работает так, как вы его вызвали. Чтобы охватить эти сеансы, поместите скрипт с именем
claudeв каталог, который находится раньше вPATH, который запускает ваш launcher с реальным бинарным файлом; не заменяйте управляемый symlink. Self-spawns не консультируютPATH, поэтому два launcher никогда не складываются. - Первый процесс
claude-cli://deep link, который обработчик протокола операционной системы запускает напрямую. Все, что этот сеанс запускает в фоне после этого, работает через launcher. Чтобы полностью закрыть этот путь, предотвратите регистрацию обработчика с помощью параметраdisableDeepLinkRegistration. - Перезапуск, который выполняет
--worktreeв сочетании с--tmux: терминальный мультиплексер запускает эту панель, а не бинарный файл Claude Code. - Хост native-messaging, который регистрирует Claude in Chrome: браузер запускает его, а не бинарный файл Claude Code.
Имена вспомогательных процессов в мониторах процессов
С настроенным launcher ps и Activity Monitor больше не показывают метки Claude Code claude bg-pty-host и claude bg-spare для фоновых вспомогательных процессов, потому что exec launcher перестраивает список аргументов. Потеря меток является побочным эффектом, а не скрытием: процессы в остальном не изменены, и Claude Code идентифицирует свои собственные процессы по пути бинарного файла, никогда по отображаемому имени.
Настройка launcher
Напишите скрипт launcher
Создайте исполняемый скрипт по абсолютному пути, например /opt/corp/launcher. Claude Code запускает его с полной командой Claude Code в качестве его аргументов, и скрипт должен заканчиваться вызовом exec "$@", чтобы он заменил себя на Claude Code:
#!/bin/sh
# Настройка вашей организации: введите sandbox, примените
# сетевые элементы управления или внедрите учетные данные.
exec "$@"
Сделайте его исполняемым с помощью chmod +x. Часть настройки — это все, что должен сделать ваш launcher перед запуском Claude Code; контракт launcher ниже перечисляет правила, которым должен следовать скрипт.
Если вы ранее заменили symlink ~/.local/bin/claude на ваш launcher, восстановите исходный symlink в том же изменении. Замененный symlink заставляет первый обернутый сеанс запустить фоновый сервис через оба launcher одновременно, и это помещает установку во внешнее управляемое состояние: /doctor это сообщает, auto-update оставляет файл на месте, и очистка старых версий остается отключенной до тех пор, пока установщик снова не будет управлять этим путем.
Установите CLAUDE_CODE_PROCESS_WRAPPER в параметрах
Установите переменную в блоке env файла параметров, чтобы отсоединенный фоновый сервис наследовал ее. Простой export в shell недостаточно: фоновый сервис запускается по требованию, переживает вашу shell и никогда не перечитывает профили shell.
Для одной машины добавьте это в ~/.claude/settings.json. Чтобы развернуть его на каждой машине в вашей организации, поместите тот же блок в managed settings:
{
"env": {
"CLAUDE_CODE_PROCESS_WRAPPER": "/opt/corp/launcher"
}
}
Когда более одного источника устанавливает переменную, значение managed settings переопределяет как ~/.claude/settings.json, так и значение, экспортированное в shell, поэтому пользователи не могут указывать self-spawns на другой launcher.
Параметр processWrapper содержит то же значение, что и именованный ключ верхнего уровня параметров. Установите его, когда ваша организация отправляет параметры как отдельные ключи, а не как блок env. Параметр processWrapper требует Claude Code v2.1.210 или более поздней версии. Следующий файл параметров устанавливает тот же launcher через ключ:
{
"processWrapper": "/opt/corp/launcher"
}
CLAUDE_CODE_PROCESS_WRAPPER имеет приоритет, когда установлены оба.
Поскольку processWrapper является именованным параметром, организация, которая доставляет его через remote managed settings, видит его в списке на диалоге одобрения безопасности рядом с другими параметрами, которые запускают исполняемые файлы, предоставленные администратором.
Параметры проекта и локальные параметры не могут установить launcher. Файл, зафиксированный в репозитории, не должен иметь возможность поместить бинарный файл перед каждым процессом Claude Code на машине, поэтому Claude Code игнорирует CLAUDE_CODE_PROCESS_WRAPPER в .claude/settings.json или .claude/settings.local.json с предупреждением в debug log, и никогда не читает ключ processWrapper из этих файлов.
Перезагрузите фоновый сервис и ваши сеансы
Работающий фоновый сервис и любые открытые сеансы claude читают переменную один раз при запуске, поэтому они продолжают запускать процессы без обертки до перезагрузки. Запустите claude daemon stop --any, чтобы остановить сервис по требованию; следующая команда, которая его нужна, например claude agents, запускает обернутый. Установленный сервис принимает claude daemon stop без --any. Затем перезагрузите открытые сеансы claude.
На машинах, которые вы не можете перезагрузить вручную, первый сеанс, запущенный после push параметров, автоматически выводит из эксплуатации оставшийся сервис по требованию без обертки. Машина, где не запускается новый сеанс, сохраняет свой сервис без обертки до тех пор, пока один не запустится, и установленный сервис всегда нуждается в перезагрузке на этом шаге.
Проверьте
Запустите /status в сеансе: запись Self-exec показывает разрешенную команду запуска и предупреждает, когда работающий фоновый сервис не совпадает с ней. claude daemon status выводит ту же информацию из shell, включая после того, как вы отмените установку переменной, когда /status больше не показывает запись.
Контракт launcher
Когда launcher не может работать, Claude Code отказывается запустить процесс вместо того, чтобы запустить его без обертки. На Windows переменная игнорируется и процессы запускаются без обертки. Claude Code придерживается скрипта этих правил:
- Заканчивайте с
exec "$@". Launcher, который разветвляет дочерний процесс и выходит, оставляет сиротский процесс Claude Code, который фоновый сервис не может отследить. Agent view отмечает такой сеанс как неудачный с сообщением, называющим launcher, и сервис собирает то, что launcher оставил позади. - Не переупорядочивайте, не поглощайте и не добавляйте аргументы в начало. Первый аргумент — это бинарный файл Claude Code, и все после него — это его argv.
- Передайте каждую унаследованную переменную окружения через
exec. Добавление переменных, таких как внедренные учетные данные, хорошо; отбрасывание унаследованных — нет.- Токены аутентификации для каждого сеанса, выбор модели и поставщика, и сам
CLAUDE_CODE_PROCESS_WRAPPERвсе путешествуют в унаследованной среде, поэтому launcher, который перестраивает ее из списка разрешений, нарушает сеансы, которые он запускает, и/statusсообщает о несоответствии launcher. - Если launcher должен войти в пространство имен или sandbox, который сбрасывает окружение, повторно экспортируйте унаследованное окружение внутри него дословно.
- Токены аутентификации для каждого сеанса, выбор модели и поставщика, и сам
- Достигните
execпримерно за три секунды каждый раз, когда запускается launcher. Холодная фоновая отправка запускает launcher дважды подряд перед первым байтом вывода, поэтому выполняйте медленную работу, такую как обмен единственным входом, лениво или из кэша. - Допускайте вызов изнутри себя. Claude Code применяет launcher к каждому вложенному self-spawn, поэтому launcher, который получает исключительный ресурс, должен обнаружить, что он его уже держит.
- Не пишите в терминал перед запуском Claude Code. Все, что напечатано перед
exec, сообщается как причина сбоя, если сеанс умирает перед инициализацией.
Формат значения launcher
CLAUDE_CODE_PROCESS_WRAPPER и параметр processWrapper принимают одинаковый формат. Для большинства launcher значение — это просто абсолютный путь скрипта, например /opt/corp/launcher.
Чтобы передать вашему launcher его собственные аргументы, напишите их после пути. Claude Code анализирует значение как список аргументов, а не команду shell:
- Пробелы разделяют токены, а двойные кавычки группируют токен, содержащий пробелы.
- Значение, которое начинается с
[, читается как массив строк JSON, например["/opt/corp/launcher", "--profile", "cc"]. - Синтаксис shell не работает: нет расширения переменных или глобализации, и неквотированный оператор, такой как
;,|,&или$(, отклоняется как ошибка конфигурации, а не переинтерпретируется.
Когда значение не может быть использовано, Claude Code отказывается запустить затронутый процесс и сообщает причину.
Отношение к `CLAUDE_CODE_SHELL_PREFIX`
CLAUDE_CODE_PROCESS_WRAPPER оборачивает собственные процессы Claude Code и передает команду через отдельные токены argv для launcher в exec. CLAUDE_CODE_SHELL_PREFIX оборачивает команды shell, которые Claude Code запускает от вашего имени, такие как вызовы инструмента Bash, hooks и команды, которые запускают серверы stdio MCP, и передает каждую как одну строку в кавычках shell в $1 для обертки для переоценки. Launcher, написанный для одного, не работает как другой.
Связанные ресурсы
- Agent view: фоновые сеансы и процесс supervisor, который охватывает launcher
- Environment variables: запись справки
CLAUDE_CODE_PROCESS_WRAPPER - Managed settings: доставьте блок
envпо всему парку - Launcher error reference: сообщения об отказе и способы восстановления