Первоначальный автор (ы) | Дэйв Заржицки |
---|---|
Разработчик (и) | Apple Inc. |
Первоначальный выпуск | 29 апреля 2005 г.; 15 лет назад (2005-04-29) |
Написано на | C |
Операционная система | macOS, FreeBSD |
Тип | Init демон |
Лицензия | Проприетарное программное обеспечение (ранее APSL и позже Apache License 2.0 ) |
Веб-сайт | с открытым исходным кодом.apple.com / tarballs / launchd / |
launchd - это демон init и управления службами операционной системы , созданный Apple Inc. как часть macOS для замены его BSD-стиля init и SystemStarter. Были предприняты попытки запустить порт на FreeBSD и производные системы.
В системе launchd есть две основные программы: launchd и launchctl.
launchd управляет демонами как на системном, так и на пользовательском уровне. Подобно xinetd, launchd может запускать демонов по запросу. Подобно watchdogd, launchd может контролировать демонов, чтобы убедиться, что они продолжают работать. launchd также заменил init как PID 1 в macOS, и в результате он отвечает за запуск системы во время загрузки.
Файлы конфигурации определяют параметры служб, запускаемых с помощью launchd. Хранящиеся в подкаталогах LaunchAgents и LaunchDaemons папок библиотеки, файлы на основе списка свойств имеют примерно тридцать различных ключей, которые можно задать. Сам launchd не знает об этих файлах конфигурации и не умеет их читать - за это отвечает "launchctl".
launchctl - это приложение командной строки, которое взаимодействует с launchd с помощью IPC и знает, как анализировать файлы списка свойств, используемые для описания заданий launchd, сериализуя их с помощью специального протокола словаря, который понимает launchd. launchctl можно использовать для загрузки и выгрузки демонов, запуска и остановки управляемых заданий по запуску, получения статистики использования системы для launchd и его дочерних процессов, а также для установки параметров среды.
launchd выполняет две основные задачи. Первый - это загрузка системы, а второй - загрузка и обслуживание сервисов.
Вот упрощенный вид запуска системы Mac OS X Tiger на PowerPC Mac (на Intel Mac EFI заменяет Open Firmware и boot.efi
заменяет BootX ):
/ etc / rc
, различные скрипты, которые сканируют / System / Library / LaunchDaemons
и / Library / LaunchDaemons
, вызывая launchctl в списках по мере необходимости, затем launchd запускает логин window.На шаге 4 сценарии запуска просматривают несколько разных каталогов в поисках заданий для запуска. Сканируются два разных каталога:
Все эти каталоги хранятся в типичных каталогах библиотеки Mac OS X.
launchd сильно отличается от SystemStarter тем, что он может не запускать все демоны во время загрузки. Ключом к launchd, как и к xinetd, является идея демонов запуска по запросу. Когда launchctl просматривает списки заданий во время загрузки, он запрашивает у launchd резервирование и прослушивание всех портов, запрошенных этими заданиями. Если это указано в списке с помощью ключа «OnDemand», демон фактически не загружен в данный момент. Напротив, launchd будет прослушивать порт, запускать демон, когда это необходимо, и выключать его, когда он больше не нужен. После загрузки демона launchd будет отслеживать его и при необходимости проверять, работает ли он. В этом смысле он похож на сторожевой таймер и разделяет требование сторожевого таймера о том, чтобы процессы не пытались самостоятельно выполнить форк или демонизировать. Если процесс уходит в фоновый режим, launchd потеряет его отслеживание и попытается перезапустить.
Mac OS X Tiger, следовательно, загружается намного быстрее, чем предыдущие выпуски. Система должна только зарегистрировать запускаемые демоны и не запускать их, пока они не понадобятся. Фактически, индикатор выполнения, который появляется во время загрузки, представляет собой просто приложение-плацебо (названное WaitingForLoginWindow), которое на самом деле не показывает ничего, кроме времени.
Самая сложная часть управления во время загрузки при запуске - это зависимости. SystemStarter имел очень простую систему зависимостей, в которой использовались ключи «Использует», «Требует» и «Предоставляет» в списке элементов автозагрузки. Есть две основные стратегии при создании зависимостей launchd на Tiger: IPC позволяет демонам общаться между собой для определения зависимостей, или демоны могут отслеживать файлы или пути на предмет изменений. Использование IPC намного сложнее, чем ключи SystemStarter, и требует от разработчика больше работы, но может привести к более чистому и быстрому запуску. SystemStarter по-прежнему поддерживался до OS X Mountain Lion, но был удален в OS X Yosemite.
В launchd управление службами централизовано в Приложение launchctl
.
Сам по себе launchctl может принимать команды из командной строки, из стандартного in или работать в интерактивном режиме. С привилегиями суперпользователя , launchctl можно использовать для внесения изменений в глобальном масштабе. Набор команд launchctl можно сделать постоянным, если он хранится в /etc/launchd.conf. (Файл ~ /.launchd.confдля каждого пользователя, по-видимому, рассматривался, но не поддерживается ни в одной из существующих версий macOS.)
launchctl связывается с launchd через Механизм IPC, специфичный для Mach.
A список свойств (plist) - это тип файла, который launchd использует для настройки программы. Когда launchd сканирует папку или задание отправляется с помощью launchctl, он читает файл plist, описывающий, как программа должна запускаться.
Ниже приводится список часто используемых ключей. Все ключи необязательны, если не указано иное. Полный список см. На странице руководства Apple для launchd.plist
.
Key | Type | Description |
---|---|---|
Label | String | Имя работа. По соглашению, метка задания такая же, как имя файла plist, без расширения.plist. Обязательно . |
Программа | Строка | Путь к исполняемому файлу. Полезно для простых запусков. По крайней мере, один из Program или ProgramArguments является обязательным . |
ProgramArguments | Массив строк | Массив строк, представляющий команду UNIX. Первая строка обычно представляет собой путь к исполняемому файлу, тогда как последние строки содержат параметры или параметры. По крайней мере, один из Program или ProgramArguments является обязательным . |
UserName | String. (по умолчанию root или текущий пользователь) | Задание будет запущено от имени данного пользователя, который может (а может и не быть) быть пользователем, отправившим его в launchd. |
OnDemand (устарело с версии 10.5) | Boolean. (по умолчанию ДА ) | Устарело с версии 10.5 с более мощным параметром KeepAlive . A логический флаг, который определяет, будет ли задание выполняться постоянно или нет. |
RunAtLoad | Boolean. (по умолчанию NO ) | A логический флаг, который определяет, запускается ли задача немедленно, когда задание загружено в launchd. |
StartOnMount | Boolean. (по умолчанию NO ) | A логический флаг, который определяет, запускается ли задача при монтировании новой файловой системы. |
QueueDirectories | Массив of strings | Наблюдать за каталогом на предмет новых файлов. Каталог должен быть пуст для начала и должен быть возвращен в пустое состояние, прежде чем QueueDirectories снова запустит свою задачу. |
WatchPaths | Массив строк | Следите за путём файловой системы на предмет изменений. Может быть файлом или папкой. |
StartInterval | Integer | Планирует выполнение задания по повторяющемуся расписанию. Указывает количество секунд ожидания между запусками. |
StartCale ndarInterval | Словарь целых чисел. или. Массив словарей целых чисел | Планирование заданий. Синтаксис аналогичен cron. |
RootDirectory | String | Перед выполнением задание будет помещено в этот каталог с помощью chrooted. |
WorkingDirectory | String | Перед выполнением задание будет chdired в этот каталог. |
| String | Ключи для определения файлов для ввода и вывода для запущенного процесса. |
LowPriorityIO | Boolean | Сообщает ядру, что эта задача имеет низкий приоритет при выполнении операций ввода-вывода файловой системы. |
AbandonProcessGroup | Boolean. (по умолчанию - NO ) | A boolean флаг, который определяет, будут ли подпроцессы, запущенные из задачи, запущенной с помощью launchd, завершаться при завершении задачи. Полезно, когда краткосрочная задача запускает долгоживущая подзадача, но может привести к процессам-зомби. |
SessionCreate | Boolean. (по умолчанию NO ) | A boolean флаг, который определяет, будет ли создан сеанс безопасности для задачи и ее подпроцессы. |
Имя каждого ключа в разделе Sockets будет помещено в среду задания при его запуске, и дескриптор файла этого сокета будет доступен в этой переменной среды. Это отличается от активации сокета systemd тем, что имя определения сокета внутри конфигурации задания жестко запрограммировано в приложении. Этот протокол менее гибкий, хотя он не требует, как systemd, от демона жесткого кодирования начального дескриптора файла ( на 2014 год это 3).
Th Программное обеспечение было разработано и написано Дэйвом Заржицки из Apple. Компания планировала заменить все следующее в средах OS X -
- и большинство из этих вещей были заменены, когда launchd был представлен в Mac OS X v10.4 (Тигр).
В 2005 году Р. Тайлер Крой перенес launchd на FreeBSD в рамках проекта Google Summer of Code. Его нельзя было запустить как PID 1 (только инициализацию сеанса), и он обычно не использовался на этой платформе.
В 2006 году Ubuntu дистрибутив Linux рассматривал использование launchd. Вариант был отклонен, поскольку исходный код подпадал под действие лицензии Apple Public Source License, что было описано как «неизбежная проблема с лицензией». Вместо этого Ubuntu разработала и перешла на собственный инструмент управления службами Upstart.
В августе 2006 года Apple перелицензировала launchd под лицензией Apache, версия 2.0, чтобы легче принять другие разработчики с открытым исходным кодом. Большинство дистрибутивов Linux используют systemd или Upstart, или продолжают init, а BSD также продолжают init.
В декабре 2013 года Р. Тайлер Крой объявил о своем намерении возобновить работу над портом launchd на FreeBSD, и его репозиторий на Github "openlaunchd" впоследствии стал активнее.
Последняя Wayback Machine Захват области Mac OS Forge для запуска был произведен в июне 2012 года, а самая последняя версия с открытым исходным кодом от Apple была 842.92.1 в коде для OS X 10.9.5.
В 2014 году с OS X 10.10 и iOS 8 Apple переместила код для запуска в libxpc с закрытым исходным кодом.
В августе 2015 года Джордан Хаббард и Кип Мэйси анонсировали NextBSD, который основан на ядре FreeBSD-CURRENT при добавлении в Mach IPC, Libdispatch, notifyd, asld, launchd и других компонентов, полученных из Дарвина, открытого исходного кода Apple для OS X.
Версия | Лицензия | Включено в macOS версии | Включено Apple Developer Tools версии |
---|---|---|---|
launchd 106 | Лицензия Apple Public Source License |
| |
launchd 106.3 | Apple Public Source License |
| |
launchd 106.10 | Лицензия Apple Public Source License |
| |
launchd 106.13 | Лицензия Apple Public Source License |
| |
launchd 106.14 | Ap Лицензия открытого исходного кода |
| |
launchd 106.20 | Apple Public Source License |
|
|
launchd 152 | Лицензия Apache 2.0 | ||
launchd 257 | Лицензия Apache 2.0 |
|
|
launchd 258.1 | Лицензия Apache 2.0 |
| |
launchd 258.12 | Лицензия Apache 2.0 |
| |
запуск 258.18 | лицензия Apache 2.0 |
| |
запуск 258,19 | лицензия Apache 2.0 |
| |
launchd 258.22 | Лицензия Apache 2.0 |
| |
launchd 258.25 | Лицензия Apache 2.0 |
| |
launchd 328 | Лицензия Apache 2.0 |
|
|
launchd 329.3 | Лицензия Apache 2.0 |
| |
launchd 329.3.1 | Лицензия Apache 2.0 |
|
|
launchd 329.3.2 | Лицензия Apache 2.0 |
| |
launchd 329.3.3 | Лицензия Apache 2.0 |
| |
launchd 392.18 | Лицензия Apache 2.0 |
| |
launchd 392.35 | Apache License 2.0 |
| |
launchd 392.36 | Apache License 2.0 |
| |
launchd 392.38 | Лицензия Apache 2.0 |
| |
launchd 392.39 | Лицензия Apache 2.0 |
| |
launc hd 442.21 | Лицензия Apache 2.0 |
| |
launchd 442.26.2 | Лицензия Apache 2.0 |
| |
запущен 842.1.4 | Лицензия Apache 2.0 |
| |
запущен 842.90.1 | Apache License 2.0 |
| |
launchd 842.92.1 | Лицензия Apache 2.0 |
|
Разработчик Apple:
Разработчик Apple на пенсии D ocuments Library:
launchd(8)
: общесистемный демон и менеджер агентов для каждого пользователя - Darwin и macOS System Manager Руководство launchd.conf (5)
– Darwin и macOS Форматы файлов Руководство launchd.plist (5)
– Darwin и macOS Форматы файлов Руководство launchctl (1)
– Darwin и macOS Общие команды Руководство Другие ссылки: