Launchd. Автозапуск программ при загрузке Mac OS X
В этот раз поговорим про автозапуск программ при загрузке 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.






Комментариев: 5
Как исправить это:
"launchctl: no plist was returned for: /Library/LaunchDaemons/smc 21.06.14.plist
nothing found to load"
Не подскажите?
Скорее всего дело в пробеле, который надо экранировать обратным слешем.
smc 21
smc\ 21
Доброго времени суток. Не могу понять как создать сам файл . plist... Не подскажите?
это обычный тестовый документ - создавать и править можно в любом текстовом редакторе. лично я предпочитаю Sublime Text
Хотелось бы реализовать нечто подобное для сценария создания RAM-диска при запуске ОС и перенести на него некоторые кеши. Не поможете решить эту задачу?