launchd
launchd — система инициализации в macOS с открытым исходным кодом, созданная для замены SysVinit и SystemStarter. Процесс launchd имеет PID 1 и занимается тем, что запускает другие процессы и перезапускает их в случае сбоя, то есть выполняет функции init (в новых версиях Linux systemd). Также он заменяет cron. Процессы, запускаемые после запуска системы до входа в систему, записываются в каталог /Library/LaunchDaemons. Процессы, запускаемые после входа в систему — в каталоге /Library/LaunchAgents. В этих каталогах создаются файлы с xml-содержимым, которые управляют запуском процессов. Были попытки портировать launchd для FreeBSD и производных систем.
launchd | |
---|---|
Тип | Система инициализации системы |
Автор | Apple Inc. |
Разработчик | Apple |
Написана на | C |
Операционная система | macOS |
Первый выпуск | 29 апреля 2005 |
Состояние | Поддерживается |
Лицензия | Apache License 2.0 |
Сайт | opensource.apple.com/tar… |
Компоненты
правитьВ launchd есть две основные программы: launchd и launchctl.
launchd — управляет демонами как на уровне системы, так и на уровне пользователя. Как и xinetd, launchd может запускать демоны по требованию. Как и watchdogd, launchd может отслеживать демонов, чтобы убедиться, что они продолжают работать.
launchctl — это приложение командной строки, которое обращается к launchd с использованием IPC и знает, как анализировать файлы, используемые для описания запускаемых заданий, и сериализовывать их с использованием специализированного словарного протокола, который понимает launchd. launchctl может использоваться для загрузки и выгрузки демонов, запуска и остановки запускаемых контролируемых заданий, получения статистики использования системы для launchd и его дочерних процессов, а также для настройки параметров среды.
launchd
правитьУ launchd есть две основные задачи. Первый — это загрузить систему, а второй — загрузка и обслуживание сервисов. Вот упрощенный вид запуска системы Mac OS X Tiger на PowerPC.
- Open Firmware активирует, инициализирует оборудование, а затем загружает BootX.
- BootX загружает ядро, и загружает все необходимые расширения ядра (kexts).
- Ядро загружает launchd. launchd запускает различные скрипты, которые сканируют папку LaunchDaemons вызывая launchctl для инициализации демонов. Затем launchd запускает окно входа в систему.
- Сценарии запуска просматривают несколько разных каталогов для выполнения заданий. Сканируются два разных каталога: Каталоги LaunchDaemons содержат элементы, которые будут запускаться от имени пользователя root, обычно это фоновые процессы. Каталоги LaunchAgents содержат задания, называемые агентскими приложениями, которые будут запускаться от имени пользователя или в контексте пользовательского пространства. Это могут быть скрипты или другие элементы переднего плана, и они могут даже включать пользовательский интерфейс. Все эти каталоги хранятся в типичных каталогах библиотек macOS.
launchd сильно отличается от SystemStarter в том, что он может не запускать все демоны во время загрузки. Ключом к launchd, как и в xinetd, является запуск демонов по требованию. Когда launchctl просматривает списки заданий во время загрузки, он запрашивает launchd зарезервировать и прослушивать все порты, запрошенные этими заданиями. Если это указано в листе с помощью клавиши «OnDemand», в данный момент демон фактически не загружается. Скорее, launchd будет прослушивать порт, запускать демона при необходимости и выключать его, когда он больше не нужен. После загрузки демона launchd будет отслеживать его и при необходимости следить за тем, чтобы он работал. Таким образом, он похож на watchdogd и разделяет требование watchdogd о том, чтобы процессы не пытались разветвляться или демонизироваться самостоятельно. Если процесс уходит в фоновый режим, launchd потеряет его и попытается перезапустить его. Mac OS X Tiger, следовательно, загружается намного быстрее, чем предыдущие версии. Система только регистрирует демоны, которые должны работать, и фактически не запускает их, пока они не понадобятся. Фактически, индикатор выполнения, который появляется во время загрузки, является просто плацебо, названный WaitingForLoginWindow[1] который на самом деле не показывает ничего, кроме времени. Самая сложная часть для управления во время запуска launchd — это зависимости. SystemStarter имеет очень простую систему зависимостей, которая использует ключи «Использует», «Требуется» и «Предоставляет» в списке элементов запуска. При создании зависимостей для запуска на Tiger существует две основные стратегии: IPC позволяет демонам общаться между собой для выработки зависимостей, или демоны могут просматривать файлы или пути изменений. SystemStarter все еще поддерживался до OS X Mountain Lion, но был удален в OS X Yosemite.
launchctl
правитьВ launchd управление службами централизовано в приложении launchctl. Сам по себе launchctl может принимать команды из командной строки, из стандартного входа или работать в интерактивном режиме. С привилегиями суперпользователя, launchctl может использоваться для внесения изменений в глобальном масштабе. launchctl связывается с launchd через Mach-специфический механизм IPC.
Список свойств
правитьСписок свойств (plist) — это тип файла, который launchd использует для конфигурации программы. Когда launchd сканирует папку или задание отправляется с launchctl, он читает файл plist, который описывает, как программа должна быть запущена.
Список часто используемых ключей приведен ниже. Все ключи являются необязательными, если не указано иное. Полный список см. На странице руководства Apple для launchd.plist[2].
Ключи | Тип | Примечание |
---|---|---|
Label
|
Строка | Название работы. По соглашению, метка задания совпадает с именем файла plist, без расширения .plist. Необходим. |
Program
|
Строка | Путь к исполняемому файлу. Полезно для простых запусков. Требуется хотя бы один ключ Program или ProgramArguments. |
ProgramArguments
|
Массив строк | Массив строк, представляющих команду UNIX. Первая строка обычно представляет собой путь к исполняемому файлу, в то время как последние строки содержат опции или параметры. Требуется хотя бы один ключ Program или ProgramArguments. |
UserName
|
строка
(по умолчанию root или текущий пользователь) |
Задание будет выполняться от имени данного пользователя, который может (или не может) быть пользователем, который отправил его на launchd. |
OnDemand
(Устарело с 10.5) |
логический
(по умолчанию ДА) |
По состоянию на 10.5 устарел с более мощной опцией KeepAlive. Логический флаг, который определяет, выполняется ли задание непрерывно или нет. |
RunAtLoad
|
логический
(по умолчанию НЕТ) |
Логический флаг, определяющий, запускается ли задача сразу после загрузки задания в launchd. |
StartOnMount
|
логический
(по умолчанию НЕТ) |
Логический флаг, определяющий, запускается ли задача при монтировании новой файловой системы. |
QueueDirectories
|
Массив строк | Смотрит каталог для новых файлов. Каталог должен быть пустым для начала и должен быть возвращен в пустое состояние, прежде чем QueueDirectories снова запустит свою задачу. |
WatchPaths
|
Массив строк | Смотрит путь к файловой системе на изменения. Может быть файл или папка. |
StartInterval
|
целое число | Планирует выполнение задания по повторяющемуся расписанию. Указывает количество секунд ожидания между запусками. |
StartCalendarInterval
|
Словарь целых чисел
или Массив словарей целых чисел |
Планирование работы. Синтаксис похож на Cron |
RootDirectory
|
Строка | Задание будет помещено в этот каталог перед выполнением. |
WorkingDirectory
|
Строка | Задание будет передано в этот каталог перед выполнением. |
|
Строка | Ключи для определения файлов для ввода и вывода для запущенного процесса. |
LowPriorityIO
|
логический | Сообщает ядру, что эта задача имеет низкий приоритет при выполнении операций ввода-вывода файловой системы. |
AbandonProcessGroup
|
логический
(по умолчанию НЕТ) |
Логический флаг, который определяет, будут ли подпроцессы, запущенные из задачи, запускаемой launchd, уничтожаться при завершении задачи. Полезно, когда недолговечное задание запускает долгоживущую подзадачу, но может привести к зомби-процессам. |
SessionCreate
|
логический
(по умолчанию НЕТ) |
Логический флаг, который определяет, будет ли создан сеанс безопасности для задачи и ее подпроцессов. |
Сокеты
правитьИмя каждого ключа в разделе «Сокеты» будет помещено в среду задания при его запуске, а файловый дескриптор данного сокета будет доступен в этой переменной среды. Это отличается от активации сокета в systemd тем, что имя определения сокета внутри конфигурации задания жестко запрограммировано в приложении. Этот протокол менее гибок, хотя он, как и systemd, не требует, чтобы демон жестко закодировал начальный дескриптор файла (по состоянию на 2014 год он равен 3[3]).
История
правитьПрограммное обеспечение было разработано и написано Дейвом Заржицким в Apple. Компания планировала заменить все следующее в среде macOS -
Большинство из этих вещей были отменены, когда launchd был представлен с Mac OS X v10.4 (Tiger).
В 2005 году R. Tyler Croy перенес запуск FreeBSD в рамках проекта Google Summer of Code. Он не может быть запущен как PID 1 (только инициализация сеанса), и на этой платформе он обычно не используется.[4]
В 2006 году дистрибутив Ubuntu Linux рассматривался с использованием launchd. Эта опция была отклонена, поскольку исходный код был под лицензией Apple Public License — описанной как «неизбежная проблема с лицензией»[5]. Вместо этого разработчики Ubuntu разработали и переключилась на собственный инструмент управления сервисами Upstart.
В августе 2006 года Apple повторно запустила launchd с лицензией Apache License версии 2.0, чтобы облегчить адаптацию других разработчиков с открытым исходным кодом[6]. Большинство дистрибутивов Linux используют systemd или Upstart, либо продолжают использовать Init, а BSD-подобные системы также продолжают использовать Init.
В декабре 2013 года Р. Тайлер Крой объявил о своем намерении возобновить работу над своей версией launchd для FreeBSD, и его репозиторий «openlaunchd» на Github впоследствии активизировался[7].
В 2014 году, начиная с OS X 10.10 и iOS 8, Apple переместила код для запуска в libxpc с закрытым исходным кодом[8] .
В августе 2015 года Джордан Хаббард и Кип Мэйси объявили о запуске NextBSD, который основан на ядре FreeBSD-CURRENT при добавлении в Mach IPC, Libdispatch, notifyd, asld, launchd и других компонентов, полученных из Darwin который состоит из открытого исходного кода для macOS.
История релизов launchd
правитьСм. также
правитьСсылки
править- System Startup Programming Topics: Creating launchd Daemons and Agents at developer.apple.com
- Technical Note TN2083: Daemons and Agents at developer.apple.com
- Getting Started with launchd cache on web.archive.org originally at developer.apple.com
- launchd in Depth from AFP548, published July 08 2005. The basis for much of this article.
- launchd: One Program to Rule Them All — Google Tech talk video presentation by the developer of launchd.
- All About launchd Items (and How To Make One Yourself): The creation of property lists for launchd
- launchd site at macosforge.org contains the official subversion repository for the launchd source.
- launchd’s source code at Mac OS Forge (click on «trunk», then «Zip Archive» to get the full source)
- launchd — FreeBSD-Wiki, launchd ported to FreeBSD
Примечания
править- ↑ http://daringfireball.net/misc/2005/04/tiger_details#waitingforloginwindow Архивная копия от 23 апреля 2007 на Wayback Machine Daring Fireball: Tiger Details
- ↑ Mac OS X Manual Page For launchd.plist(5) . Дата обращения: 15 декабря 2019. Архивировано 26 августа 2009 года.
- ↑ little-big-h. node-launchd . Дата обращения: 10 апреля 2014. Архивировано 13 апреля 2014 года.
- ↑ Launchd . FreeBSD wiki. Дата обращения: 8 декабря 2013. Архивировано 14 декабря 2013 года.
- ↑ ReplacementInit . UbuntuWiki. Дата обращения: 2 июля 2007. Архивировано 4 июня 2011 года.
- ↑ Prabhakar, Ernest Apple Opens Up: Kernel, Mac OS Forge, iCal Server, Bonjour, Launchd (7 августа 2006). Дата обращения: 2 июля 2007. Архивировано из оригинала 20 августа 2011 года.
- ↑ Croy, R Tyler The scratchiest neckbeard, or FreeBSD on my Thinkpad X200 . unethicalblogger.com. Дата обращения: 8 декабря 2013. Архивировано 13 декабря 2013 года.
- ↑ Levin, Jonathan Launchd – At Your Service! (PDF) 32 (2014). — «… 10.10: moved to libxpc 559 (560 in iOS 8) – Source not available yet – and may not ever be – Libxpc is a closed source project …» Дата обращения: 3 сентября 2016. Архивировано 7 февраля 2016 года.
- ↑ launchd 106 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.4 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ Mac OS X 10.4.1 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 106.3 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.4.2 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.3 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ Mac OS X 10.4.4.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 17 октября 2020 года.
- ↑ Mac OS X 10.4.5.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 106.10 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.4.4.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.5.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ launchd 106.13 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.4.6.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 10 октября 2020 года.
- ↑ Mac OS X 10.4.6.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 106.14 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.4.7.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.7.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ Mac OS X 10.4.8.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.9.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ Mac OS X 10.4.10.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.11.ppc - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 106.20 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.4.8.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.9.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.4.10.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ Mac OS X 10.4.11.x86 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 152 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ launchd 257 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.5.1 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 258.1 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5.2 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ launchd 258.12 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5.3 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.5.4 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 258.18 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5.5 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 258.19 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5.6 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ launchd 258.22 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5.7 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 258.25 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.5.8 - Source . Дата обращения: 13 декабря 2019. Архивировано 11 октября 2019 года.
- ↑ launchd 328 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.6 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.6.1 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ Mac OS X 10.6.2 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 329.3 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.6.3 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 329.3.1 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.6.4 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ launchd 329.3.2 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.6.5 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ launchd 329.3.3 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.6.6 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.6.7 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.6.8 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ launchd 392.18 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.7 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.7.1 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 392.35 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.7.2 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 392.36 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.7.3 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 392.38 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.7.4 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ launchd 392.39 license file . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.7.5 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ licence header in launchd 442.21 source code . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.8 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.8.1 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ license header in launchd 442.26.2 source code . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ Mac OS X 10.8.2 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.8.3 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.8.4 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ Mac OS X 10.8.5 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ license header in launchd 842.1.4 source code . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ OS X 10.9 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ OS X 10.9.1 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ license header in launchd 842.90.1 source code . Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
- ↑ OS X 10.9.2 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ OS X 10.9.3 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
- ↑ license header in launchd 842.92.1 source code . Дата обращения: 13 декабря 2019. Архивировано 24 сентября 2018 года.
- ↑ OS X 10.9.4 - Source . Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
- ↑ OS X 10.9.5 - Source . Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.