Элементы запуска

Элемент запуска является специализированным пакетом, код которого выполняется во время заключительной фазы процесса начальной загрузки, и в другие предопределенные времена (см. Управляющие Элементы Запуска). Элемент запуска обычно содержит сценарий оболочки или другой исполняемый файл вместе с конфигурационной информацией, используемой системой для определения порядка выполнения для всех элементов запуска.

/System/Library/StartupItems каталог резервируется для элементов запуска та поставка с OS X. Все другие элементы запуска должны быть помещены в /Library/StartupItems каталог. Обратите внимание на то, что этот каталог не существует по умолчанию и, возможно, должен быть создан во время установки элемента запуска.

Анатомия элемента запуска

В отличие от многих других связанных структур, элемент запуска не появляется как непрозрачный файл в Средстве поиска. Элемент запуска является каталогом, исполнимая программа которого и список свойств конфигурации находятся в каталоге верхнего уровня. Имя исполнимой программы элемента запуска должно соответствовать имя самого элемента запуска. Имя списка свойств конфигурации всегда StartupParameters.plist. В зависимости от Ваших потребностей можно также включать другие файлы в каталог пакета элемента запуска.

MyStartupItem/
    |
    |- MyStartupItem
    \- StartupParameters.plist

Создать Ваш элемент запуска:

  1. Создайте каталог элемента запуска. Имя каталога должно соответствовать поведению, которое Вы обеспечиваете.

    Пример: MyDBServer

  2. Добавьте свою исполнимую программу к каталогу. Имя Вашей исполнимой программы должно быть точно тем же как именем каталога. Для получения дополнительной информации посмотрите Создание Исполнимой программы Элемента Запуска.

  3. Создайте список свойств с именем StartupParameters.plist и добавьте его к каталогу. Для получения информации о ключах для включения в этот список свойств посмотрите Указание Свойств Элемента Запуска.

    Пример: MyDBServer/StartupParameters.plist

  4. Создайте установщик для размещения элемента запуска в /Library/StartupItems каталог целевой системы. (Ваш установщик, возможно, должен создать этот каталог сначала.)

    Ваш сценарий установщика должен установить полномочия каталога элемента запуска препятствовать тому, чтобы некорневые пользователи изменили элемент запуска или его содержание. Для получения дополнительной информации см. Полномочия Элемента Запуска.

Создание исполнимой программы элемента запуска

Исполнимая программа элемента запуска может быть двоичным исполняемым файлом или исполнимым сценарием оболочки. Сценарии оболочки более обычно используются, потому что их проще создать и изменить.

При реализации исполнимой программы элемента запуска как сценария оболочки OS X обеспечивает некоторый код для упрощения процесса создания сценария. Файл /etc/rc.common определяет подпрограммы для обработки параметров командной строки и для сбора параметров настройки системы. В Вашем сценарии оболочки получите rc.common файл и вызов RunService подпрограмма, передавая его первый параметр командной строки, как показано в следующем примере:

#!/bin/sh
. /etc/rc.common
 
# The start subroutine
StartService() {
    # Insert your start command below.  For example:
    mydaemon -e -i -e -i -o
    # End example.
}
 
# The stop subroutine
StopService() {
    # Insert your stop command(s) below.  For example:
    killall -TERM mydaemon
    sleep 10
    killall -9 mydaemon
    # End example.
}
 
# The restart subroutine
RestartService() {
    # Insert your start command below.  For example:
    killall -HUP mydaemon
    # End example.
}
 
RunService "$1"

RunService подпрограмма ищет StartService, StopService, и RestartService функции в Вашем сценарии оболочки и вызывают их, чтобы запустить, остановить или перезапустить Ваши службы по мере необходимости. Необходимо обеспечить реализации для всех трех подпрограмм, несмотря на то, что реализации могут быть пустыми для подпрограмм, команды которых служба не поддерживает.

Если Ваша исполнимая программа элемента запуска содержит код, который мог бы занять много времени для окончания, полагать, что порождение от фонового процесса выполнило тот код. Выполнение длинных задач запуска непосредственно из Ваших сценариев задерживает системный запуск. Ваш сценарий элемента запуска должен выполниться как можно быстрее и затем выйти.

Для получения дополнительной информации о записи сценариев оболочки, посмотрите, что Shell Пишет сценарий Учебника для начинающих.

Указание свойств элемента запуска

Список свойств конфигурации элемента запуска предоставляет дескриптивную информацию об элементе запуска, перечисляет услуги, которые это предоставляет и перечисляет свои зависимости от других служб. OS X использует службу и информацию о зависимостях для определения порядка запуска на элементы запуска. Этот список свойств сохранен в формате ASCII (в противоположность XML) и может быть создан с помощью Редактора Списка свойств приложение.

Таблица a-1 перечисляет пары ключ/значение, которые можно включать в элемент запуска StartupParameters.plist файл. Каждый из перечисленных массивов содержит строковые значения. Можно использовать Редактора Списка свойств приложение, идущее с Инструментами XCode для создания этого списка свойств. Сохранив Ваш файл списка свойств, убедиться сохранить его как файл списка свойств ASCII.

Таблица a-1  пары ключ/значение StartupParameters.plist

Ключ

Ввести

Значение

Описание

Строка

Краткое описание элемента запуска, используемого средствами администрирования.

Обеспечивает

Массив

Имена услуг, предоставленных этим элементом запуска. Несмотря на то, что элемент запуска может потенциально предоставить многократные услуги, рекомендуется ограничить элементы запуска только одной службой каждый.

Требует

Массив

Услуги, предоставленные другими элементами запуска, которые должны работать перед этим элементом запуска, могут быть запущены. Если требуемые службы не доступны, этот элемент запуска не выполняется.

Использование

Массив

Услуги, предоставленные другими не требующимися элементами запуска, которые должны быть запущены перед этим элементом запуска, но. Элемент запуска должен быть в состоянии запуститься без доступности этих служб.

Например, вот plist старого стиля:

{
  Description     = "Software Update service";
  Provides        = ("SoftwareUpdateServer");
  Requires        = ("Network");
  Uses            = ("Network");
  OrderPreference = "Late";
  Messages =
  {
    start = "Starting Software Update service";
    stop  = "Stopping Software Update service";
  };
}

И вот является XML plist примером:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
    <dict>
        <key>Description</key>
        <string>Apple Serial Terminal Support</string>
        <key>OrderPreference</key>
        <string>Late</string>
        <key>Provides</key>
        <array>
                <string>Serial Terminal Support</string>
        </array>
        <key>Uses</key>
        <array>
                <string>SystemLog</string>
        </array>
    </dict>
</plist>

Имена службы Вы указываете в Requires и Uses массивы могут не всегда соответствовать непосредственно имени элемента запуска, предоставляющего ту услугу. Provides свойство указывает подлинное имя услуги, предоставленной элементом запуска, и в то время как это имя обычно соответствует имя элемента запуска, это не требуется, чтобы делать так. Например, если элемент запуска запускает многократные услуги, только одна из тех служб может иметь то же имя как элемент запуска.

Если два элемента запуска предоставляют услугу с тем же именем, система выполняет только первый элемент запуска, который это находит с тем именем. Это - одна из причин, почему Ваши собственные элементы запуска должны запустить только одну услугу. Если имя только одной из служб соответствует имя другой службы, весь элемент запуска не мог бы быть выполнен, и никакая услуга не будет запущена.

Значения Requires и Uses ключи не гарантируют определенного порядка запуска.

В OS X v10.4 и позже, самые низкоуровневые службы запускаются с launchd. К тому времени, когда Ваш элемент запуска начинает выполняться, launchd работает, и любая попытка получить доступ к любой из услуг, предоставленных a launchd демон приведет к тому демону, запускающемуся. Таким образом можно безопасно принять (или по крайней мере притвориться), который выполняет любая из этих служб к тому времени, когда элемент запуска вызывают.

Поэтому за редким исключением, Requires и Uses ключи в основном не важны после OS X v10.3 кроме к зависимостям от услуги по поддержке между двумя или больше сторонними элементами запуска.

Управление элементами запуска

Во время процесса начальной загрузки система запускает доступные элементы запуска, передавая a start параметр исполнимой программе элемента запуска. После процесса начальной загрузки система может выполнить исполнимую программу элемента запуска снова, на сей раз передав его a restart или stop параметр. Ваша исполнимая программа элемента запуска должна проверить переданный аргумент и действовать соответственно, чтобы запустить, перезапустить, или остановить соответствующие службы.

Если Вы хотите запустить, перезапустить, или элементы запуска остановки из Ваших собственных сценариев, можно сделать настолько использующий SystemStarter программа. Использовать SystemStarter, необходимо выполнить его с двумя параметрами: желаемое действие и имя услуги, предоставленной элементом запуска. Например, для перезапуска веб-сервера Apache (до OS X v10.4) Вы выполнили бы следующую команду:

/sbin/SystemStarter restart "Web Server"

Элементы запуска должны всегда уважать параметры, переданные в SystemStarter. Однако ответ на те параметры зависит от элемента запуска. Остановка и опции перезапуска могут не быть целесообразными во всех случаях. Ваш элемент запуска мог также поддерживать опцию перезапуска с помощью существующего кода для остановки и запуска ее службы.

Отображение и локализация сообщения запуска

Когда Ваш элемент запуска запускается во время начальной загрузки, можно (при желании) вывести на экран сообщение пользователю. Чтобы сделать это, используйте ConsoleMessage команда. (Можно использовать эту команду, даже если компьютер не запускает, но пользователь не будет видеть его, если не будет работать Консольное приложение.)

Например:

ConsoleMessage "MyDaemon is running.  Better go catch it."

Если Вы хотите локализовать сообщение, выведенное на экран, когда элемент запуска запускается, необходимо создать серию файлов списка свойств с локализованными версиями строк. Каждый из этих файлов нужно назвать Localizable.strings, и должен быть в локализованном каталоге проекта, имя которого основывается на имени языка или кода локали для желаемого языка. Эти папки, в свою очередь, должен быть в вызванной папке Resources в папке элемента запуска.

Например, Вы могли бы создать древовидную структуру, которая похожа на это:

MyDaemon
    |
    |- MyDaemon
    |- StartupParameters.plist
    \- Resources
            |
            |- English.lproj
            |- French.lproj
            |- German.lproj
            \- zh_CN.lproj

В каждом из этих файлов локализуемых строк необходимо включать словарь, ключи которого отображают английскую строку на строку на другом языке. Например, французская версия PrintingServices файл локализации похож на это:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Starting printing services</key>
        <string>Démarrage des services d’impression</string>
    </dict>
</plist>

Каждый раз, когда ConsoleMessage команда передается строка, “Начинающая печать служб”, если предпочтение языка пользователя будет французским, то пользователь будет вместо этого видеть «Démarrage des services d'impression» при запуске. C’est très bien!

Значение поля ключа должно точно соответствовать английскую строку, распечатанную Вашим использованием элемента запуска ConsoleMessage.

См. страницу руководства для locale для получения дополнительной информации о кодах локали.

Полномочия элемента запуска

Поскольку элементы запуска работают с корневыми полномочиями, необходимо удостовериться, что полномочия каталога элемента запуска установлены правильно. Для соображений безопасности Ваш каталог элемента запуска должен принадлежать корню, группа должна быть установлена вертеть, и полномочия для каталога должны быть 755 (rwxr-xr-x). Это означает, что только пользователь root может изменить содержание каталога; другие пользователи могут исследовать каталог и просмотреть его содержание, но не могут изменить их. Файлы в каталоге должны иметь подобные полномочия и владение. Таким образом перечисление файла для каталога элемента запуска Apache следующие:

./Apache:
total 16
drwxr-xr-x    4 root  wheel   136 Feb 14 14:33 .
drwxr-xr-x   21 root  wheel   714 Feb 14 15:03 ..
-rwxr-xr-x    1 root  wheel  1253 Feb 10 19:31 Apache
-rw-r--r--    1 root  wheel   152 Feb 10 19:31 StartupParameters.plist