Элементы запуска
Элемент запуска является специализированным пакетом, код которого выполняется во время заключительной фазы процесса начальной загрузки, и в другие предопределенные времена (см. Управляющие Элементы Запуска). Элемент запуска обычно содержит сценарий оболочки или другой исполняемый файл вместе с конфигурационной информацией, используемой системой для определения порядка выполнения для всех элементов запуска.
/System/Library/StartupItems
каталог резервируется для элементов запуска та поставка с OS X. Все другие элементы запуска должны быть помещены в /Library/StartupItems
каталог. Обратите внимание на то, что этот каталог не существует по умолчанию и, возможно, должен быть создан во время установки элемента запуска.
Анатомия элемента запуска
В отличие от многих других связанных структур, элемент запуска не появляется как непрозрачный файл в Средстве поиска. Элемент запуска является каталогом, исполнимая программа которого и список свойств конфигурации находятся в каталоге верхнего уровня. Имя исполнимой программы элемента запуска должно соответствовать имя самого элемента запуска. Имя списка свойств конфигурации всегда StartupParameters.plist
. В зависимости от Ваших потребностей можно также включать другие файлы в каталог пакета элемента запуска.
MyStartupItem/ |
| |
|- MyStartupItem |
\- StartupParameters.plist |
Создать Ваш элемент запуска:
Создайте каталог элемента запуска. Имя каталога должно соответствовать поведению, которое Вы обеспечиваете.
Пример:
MyDBServer
Добавьте свою исполнимую программу к каталогу. Имя Вашей исполнимой программы должно быть точно тем же как именем каталога. Для получения дополнительной информации посмотрите Создание Исполнимой программы Элемента Запуска.
Создайте список свойств с именем
StartupParameters.plist
и добавьте его к каталогу. Для получения информации о ключах для включения в этот список свойств посмотрите Указание Свойств Элемента Запуска.Пример:
MyDBServer/StartupParameters.plist
Создайте установщик для размещения элемента запуска в
/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.
Например, вот 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 |