Launchd. Автозапуск программ при загрузке Mac OS X

Июль, 08th 2013
Рубрика: Apple изнутри
Подписаться на комментарии по RSS

Launchd

В этот раз поговорим про автозапуск программ при загрузке Mac OS X. Статья рассчитана на продвинутых пользователей и тех кто стремится к этому уровню. В MacOS X имеется встроенное решение для выполнения автоматизации различных действий - Automator. Программа очень продвинутая в умелых руках, о которой можно писать целые книги, однако сегодня речь пойдет о другом.

Mac OS X, как и другие UNIX-подобные операционные системы, предоставляет просто потрясающие возможности по управлению процессами, демонами и запуском приложений по расписанию. К примеру, можно запустить собственный веб-сервер, выполнять скрипты или программы по расписанию, монтировать файловые системы и т.д. Применений на самом деле масса.

Не так давно, я писал про ограничение оборотов кулера на Mac, таким способом можно снизить шум на MacBook, Mac mini или iMac. Остался, правда, не раскрытым один достаточно важный вопрос, а именно, как автоматизировать запуск нашей утилиты, управляющей работой кулера? Согласитесь, не очень удобно всякий раз лезть в консоль и запускать её вручную. Так что, предлагаю на этом конкретном примере разобраться с Launchd и ознакомиться с сервисами и демонами в Mac OS X.

Services (сервисы) и Daemons (демоны) Mac OS X.

Для начала немного теории. «Сервисы» и «демоны» являются системными службами и обеспечивают работу системы, однако предназначены немного для разных целей, соответственно и работают тоже по-разному. Давайте разберемся, что конкретно делают эти «сервисы» и «демоны» и в чем разница между ними?

Начнем с того, что делают они практически всё, начиная с запуска WEB-сервера и заканчивая монтированием файловых систем и запуском графической оболочки. Разница же между ними в том, что «сервисы», как правило, запускаются после загрузки графического интерфейса и предназначены, в основном, для запуска графических приложений; «демоны» могут запускаться до загрузки графики, в фоновом режиме и предназначены запуска bash/shell скриптов, серверов (служб) и всевозможных консольных утилит.

Сервисы представляют из себя конфигурационные XML файлы с расширением .plist, которые во время загрузки Mac OS обрабатываются и запускаются фоновым процессом launchd. Файлы .plist находятся в директориях LaunchAgents или LaunchDaemons (в зависимости от их предназначения). В системе имеется несколько директорий LaunchAgents и LaunchDaemons. Это ключевой момент в понимании того как происходит работа системы и его стоит рассмотреть подробнее:

  • ~/Library/LaunchAgents

    Все конфигурационные файлы, находящиеся в данной директории, выполняются при входе в систему (логине) КОНКРЕТНОГО пользователя (в каталоге которого они находятся) и с правами этого пользователя, не затрагивая при этом систему и других пользователей.

  • /Library/LaunchAgents

    Системная директория. Все находящиеся в ней конфигурационные файлы исполняются при логине ЛЮБОГО пользователя с правами вошедшего пользователя.

  • /Library/LaunchDaemons

    Снова системная директория, но все конфиги исполняются от лица администратора (root) на уровне системы. Программа или сценарий будет исполнен вне зависимости от того, вошёл какой-либо пользователь в систему или нет. Это и есть нужный нам вариант.

  • /System/Library/LaunchAgents

    Системная директория зарезервированная OS X. Все конфиги находящиеся в ней являются системными, запускаются при логине любого пользователя. Лучше сюда не лезть без нужды.

  • /System/Library/LaunchAgents

    Системная директория зарезервированная OS X. Все конфиги, находящиеся в ней, являются системными и запускаются при загрузке системы с правами root. Сюда тоже не стоит лезть.

Как вы уже догадались, директории LaunchAgents используются для запуска «сервисов», а LaunchDaemons - для запуска «демонов».

Файлы конфигурации .plist

Как уже говорилось, все конфигурационные .plist-файлы запускаются фоновым процессом launchd во время загрузки OS X.

Сами по себе .plist-файлы всего лишь «сценарии», набор неких правил, для запуска других приложений и не являются самостоятельными программами, однако отличаются гибкостью и функциональностью в настройке. Пора рассмотреть пример, свой файл сценария я назвал my.fancontrol.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>FanControl</string>
  <key>ProgramArguments</key>
  <array>
     <string>/Applications/smcFanControl.app/Contents/Resources/smc</string>
     <string>-k</string>
     <string>F0Mx</string>
     <string>-w</string>
     <string>36b0</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Пока вообще ничего не понятно, ну это мы сейчас поправим. Напомню задачу - необходимо при запуске Mac OS X, до входа пользователя в систему (а то какая-то несправедливость получится) в терминале выполнить команду:

/Applications/smcFanControl.app/Contents/Resources/smc -k F0Mx -w 36b0

Тем самым мы запускаем утилиту smc и передаем ей два параметра - указываем кулер и выставляем ему максимальную частоту оборотов. Выше вы видите получившийся код нашего сценария со стандартной шапкой формата XML (для всех служб и демонов она одинакова).

Что я тут понаписал? Итак, основные ключи и параметры .plist-файла:

<key>Label</key>
<string>FanControl</string>

Ключ «Label» задаёт название сервиса, которое будет отображаться в Мониторинге системы или логах утилиты Консоль.

<key>ProgramArguments</key>
<array>
   <string>/Applications/smcFanControl.app/Contents/Resources/smc</string>
   <string>-k</string>
   <string>F0Mx</string>
   <string>-w</string>
   <string>36b0</string>
</array>

Ключ «ProgramArguments» содержит массив, в котором указаны путь к исполняемому файлу (или bash/shell скрипту) и параметры его запуска. Заметьте, что каждый параметр необходимо записывать отдельно.

<key>RunAtLoad</key>
<true/>

Ключ «RunAtLoad» указывает системе, что правило нужно исполнить при загрузке ОС. Есть еще много всяких ключей и параметров, например для запуска приложения по расписанию или через определенные промежутки времени. Этой статьёй я даю лишь толчок для понимания дальнейшего изучения Launchd в OS X и не ставлю целью создать полноценное руководство.

файл создан. Осталось переместить его в папку-назначение (/Library/LaunchDaemons), поправить права доступа и атрибуты, и перезагрузиться. В терминале пишем:

#выполняем действия от root
sudo -s
#перемещаем файл сценария
mv ~/Desktop/my.fancontrol.plist /Library/LaunchDaemons/
#правим права доступа
chown root:wheel /Library/LaunchDaemons/my.fancontrol.plist
#правим атрибуты
chmod 755 /Library/LaunchDaemons/my.fancontrol.plist

Активировать или дезактивировать работающий сценарии можно выполнив команды:

#launchctl load /Library/LaunchDaemons/[имя.вашего.файла].plist
#launchctl unload /Library/LaunchDaemons/[имя.вашего.файла].plist

Напоследок, как обычно, ссылочка на хорошую статью про методы автозагрузки приложений в Mac OS X. LaunchAgents и LaunchDaemons.

Если вы считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

Комментариев: 2

  1. 2014-02-09 в 21:11:08 | monderald

    Как исправить это:

    "launchctl: no plist was returned for: /Library/LaunchDaemons/smc 21.06.14.plist

    nothing found to load"

    Не подскажите?

  2. 2016-05-15 в 19:33:24 | k0ttee

    Скорее всего дело в пробеле, который надо экранировать обратным слешем.

    smc 21

    smc\ 21

comments powered by HyperComments
Без регистрации
ваш комментарий будет опубликован после проверки
Регистрация на сайте

На указанный адрес будет отправлено письмо с кодом активации. Вы можете настроить собственный профиль и стать активным участником или автором.