launchd — система инициализации в macOS с открытым исходным кодом, созданная для замены SysVinit и SystemStarter. Процесс launchd имеет PID 1 и занимается тем, что запускает другие процессы и перезапускает их в случае сбоя, то есть выполняет функции init (в новых версиях Linux systemd). Также он заменяет cron.
Процессы, запускаемые после запуска системы до входа в систему, записываются в каталог /Library/LaunchDaemons. Процессы, запускаемые после входа в систему — в каталоге /Library/LaunchAgents. В этих каталогах создаются файлы с xml-содержимым, которые управляют запуском процессов. Были попытки портировать launchd для FreeBSD и производных систем.
Компоненты
В 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
|
Строка
|
Задание будет передано в этот каталог перед выполнением.
|
StandardInPath ,
StandardOutPath ,
StandardErrorPath
|
Строка
|
Ключи для определения файлов для ввода и вывода для запущенного процесса.
|
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
См. также
Ссылки
Примечания
|
---|
Приложения | |
---|
Утилиты | |
---|
Технологии и пользовательский интерфейс | |
---|