- Launchd. Автозапуск программ при загрузке Mac OS X
- Services (сервисы) и Daemons (демоны) Mac OS X.
- Файлы конфигурации .plist
- Комментариев: 5
- Запускаем программы при запуске Mac OS X — Launchd
- Daemons and Services Programming Guide
- Creating Launch Daemons and Agents
- Launching Custom Daemons Using launchd
- The launchd Startup Process
- Creating a launchd Property List File
- Writing a “Hello World!” launchd Job
- Listening on Sockets
- Debugging launchd Jobs
- Running a Job Periodically
- Monitoring a Directory
- Emulating inetd
- Behavior for Processes Managed by launchd
- Required Behaviors
- Recommended Behaviors
- Deciding When to Shut Down
- Special Dependencies
- Network Availability
- Disk or Server Availability
- Non-launchd Daemons
- User Logins
- Kernel Extensions
- For More Information
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. Это ключевой момент в понимании того как происходит работа системы и его стоит рассмотреть подробнее:
Все конфигурационные файлы, находящиеся в данной директории, выполняются при входе в систему (логине) КОНКРЕТНОГО пользователя (в каталоге которого они находятся) и с правами этого пользователя, не затрагивая при этом систему и других пользователей.
Системная директория. Все находящиеся в ней конфигурационные файлы исполняются при логине ЛЮБОГО пользователя с правами вошедшего пользователя.
Снова системная директория, но все конфиги исполняются от лица администратора (root) на уровне системы. Программа или сценарий будет исполнен вне зависимости от того, вошёл какой-либо пользователь в систему или нет. Это и есть нужный нам вариант.
Системная директория зарезервированная OS X. Все конфиги находящиеся в ней являются системными, запускаются при логине любого пользователя. Лучше сюда не лезть без нужды.
Системная директория зарезервированная OS X. Все конфиги, находящиеся в ней, являются системными и запускаются при загрузке системы с правами root. Сюда тоже не стоит лезть.
Как вы уже догадались, директории LaunchAgents используются для запуска «сервисов», а LaunchDaemons — для запуска «демонов».
Файлы конфигурации .plist
Как уже говорилось, все конфигурационные .plist-файлы запускаются фоновым процессом launchd во время загрузки OS X.
Сами по себе .plist-файлы всего лишь «сценарии», набор неких правил, для запуска других приложений и не являются самостоятельными программами, однако отличаются гибкостью и функциональностью в настройке. Пора рассмотреть пример, свой файл сценария я назвал my.fancontrol.plist:
Пока вообще ничего не понятно, ну это мы сейчас поправим. Напомню задачу — необходимо при запуске Mac OS X, до входа пользователя в систему (а то какая-то несправедливость получится) в терминале выполнить команду:
Тем самым мы запускаем утилиту smc и передаем ей два параметра — указываем кулер и выставляем ему максимальную частоту оборотов. Выше вы видите получившийся код нашего сценария со стандартной шапкой формата XML (для всех служб и демонов она одинакова).
Что я тут понаписал? Итак, основные ключи и параметры .plist-файла:
Ключ «Label» задаёт название сервиса, которое будет отображаться в Мониторинге системы или логах утилиты Консоль.
Ключ «ProgramArguments» содержит массив, в котором указаны путь к исполняемому файлу (или bash/shell скрипту) и параметры его запуска. Заметьте, что каждый параметр необходимо записывать отдельно.
Ключ «RunAtLoad» указывает системе, что правило нужно исполнить при загрузке ОС. Есть еще много всяких ключей и параметров, например для запуска приложения по расписанию или через определенные промежутки времени. Этой статьёй я даю лишь толчок для понимания дальнейшего изучения Launchd в OS X и не ставлю целью создать полноценное руководство.
файл создан. Осталось переместить его в папку-назначение (/Library/LaunchDaemons), поправить права доступа и атрибуты, и перезагрузиться. В терминале пишем:
Активировать или дезактивировать работающий сценарии можно выполнив команды:
Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.
Комментариев: 5
Как исправить это:
«launchctl: no plist was returned for: /Library/LaunchDaemons/smc 21.06.14.plist
nothing found to load»
Скорее всего дело в пробеле, который надо экранировать обратным слешем.
Доброго времени суток. Не могу понять как создать сам файл . plist. Не подскажите?
это обычный тестовый документ — создавать и править можно в любом текстовом редакторе. лично я предпочитаю Sublime Text
Хотелось бы реализовать нечто подобное для сценария создания RAM-диска при запуске ОС и перенести на него некоторые кеши. Не поможете решить эту задачу?
Источник
Запускаем программы при запуске Mac OS X — Launchd
Начнем с истории. Жили были десяток программ для запуска процессов или программ. И тысячи скриптов к ним. Dave Zarzycki из Apple решил написать программу, которая отличалась бы от выше написанных и предлагала бы единый, стандартизированный интерфейс к любым программам запускающим автоматически системой и другие вкусности.
Вот и вся история. Теперь к самой программе.
Называется она Launchd. И она с открытом исходным кодом. Опен сорс.
Все процессы при старте системы(в Mac OS X) запускаются одним процессом launchd. При загрузке launchd вызывается ядром как первый процесс и дальше вся система стартует с помощью него. Так же Launchd следит за тем чтобы процесс был запущен. Если он вдруг упадет, Launchd ему поможет и поднимет его.
Для начала решим для чего нам нужно запустить что-либо при загрузке и когда это надо сделать.
Если вам нужно чтобы программа или процесс запустился при запуске системы и даже когда пользователь не вошел, то следует создать файл в папке /Library/LaunchDaemons. Если же нужно только когда вы вошли в систему то в папке /Library/LaunchAgents. Так же можно использовать и другие директории, но в данной статье мы не будем их касаться.
Давайте создадим Daemon для запуска php-fcgi процессов.
sudo mate /Library/LaunchDaemons/com.php-fcgi
И так что же нам туда писать?
Сначала уясним что Property List это Xml файл. И он должен быть валидным. Иначе ничего не будет работать.
В Textmate есть проверка валидности этих файлов, так что никаких пробелем возникнуть не должно.
В этом файле должны содержаться 3 обязательных ключа.
Label — уникальный идентификатор.
ProgramArguments — По сути это путь и параметры запускаемой программы.
Первая строка всегда путь к программе если не используется ключ Program.
Последующие строки будут параметрами. Каждый параметр и его значение лучше писать в разные строки.
OnDemand — Этот ключ говорит Launchd перезапустить процесс если он не запустился или упал. Так же устновив значение false говорит о том, что мы хотим чтобы процесс был запущен всегда.
Теперь обернем это все в стандартную запись присутсвующую во всех файлах подобного типа.
Сохраним. Теперь Launchctl — это программа интерфейс для Launchd.
С помощью нее мы сможем включать или выключать загрузку нашего кофигурационного файла.
Например следующая команда включит наш файл.
sudo launchctl load -w /Library/LaunchDaemons/com.php-fcgi.plist
А эта выключит.
sudo launchctl unload -w /Library/LaunchDaemons/com.php-fcgi.plist
И добавит ключ с параметром в наш файл.
Вобщем теперь у нас при загрузке должно запускаться 5 процессов php-cgi. Перезапускать их можно командой
sudo launchctl stop php
а так как у нас стоит OnDemand false, то это просто перезапустит процесс.
Да чуть не забыл. Если вы хотите добавить переменные окружения, то надо написать примерно так
А теперь бонусы
Для многих копаться в командной строке лень или сложно. Для них есть вариант полегче. Это бесплатная программа Lingon.
Так же с помощью этой программы вы можете открыть com.apple.syslogd
и вместо /usr/sbin/syslogd написать /usr/sbin/syslogd -c 3 -a
Параметр -с 3 скажет игнорировать менее важные сообщения. И syslogd будет записывать только важные сообщения. Если хотите 0 это самые важные. 8 наименее.
Параметр -а скажет syslogd архивировать записи. И очищать активную базу записей каждые 24 часа.
Все это сделает немного быстрее ваш мак.
PS.
Когда я разбирался с launchd я столкнулся с небольшой проблемой. При старте вызывалась программа spawn-php (да я знаю что это было глупо) и она вызывала php-cgi процессы. При тестировании все было хорошо. Но при загрузке ничего не происходило. Только с десятого раза получалось запустить процессы. Не знаю с чем это было связано, может это проблема именно в spawn-php, но она решилась способом, который я описал выше, т.е. вызовом напрямую процесса.
Источник
Daemons and Services Programming Guide
Creating Launch Daemons and Agents
If you are developing daemons to run on OS X, it is highly recommended that you design your daemons to be launchd compliant. Using launchd provides better performance and flexibility for daemons. It also improves the ability of administrators to manage the daemons running on a given system.
If you are running per-user background processes for OS X, launchd is also the preferred way to start these processes. These per-user processes are referred to as user agents. A user agent is essentially identical to a daemon, but is specific to a given logged-in user and executes only while that user is logged in.
Unless otherwise noted, for the purposes of this chapter, the terms “daemon” and “agent” can be used interchangeably. Thus, the term “daemon” is used generically in this section to encompass both system-level daemons and user agents except where otherwise noted.
There are four ways to launch daemons using launchd . The preferred method is on-demand launching, but launchd can launch daemons that run continuously, and can replace inetd for launching inetd -style daemons. In addition, launchd can start jobs at timed intervals.
Although launchd supports non-launch-on-demand daemons, this use is not recommended. The launchd daemon was designed to remove the need for dependency ordering among daemons. If you do not make your daemon be launched on demand, you will have to handle these dependencies in another way, such as by using the legacy startup item mechanism.
Launching Custom Daemons Using launchd
With the introduction of launchd in OS X v10.4, an effort was made to improve the steps needed to launch and maintain daemons. What launchd provides is a harness for launching your daemon as needed. To client programs, the port representing your daemon’s service is always available and ready to handle requests. In reality, the daemon may or may not be running. When a client sends a request to the port, launchd may have to launch the daemon so that it can handle the request. Once launched, the daemon can continue running or shut itself down to free up the memory and resources it holds. If a daemon shuts itself down, launchd once again relaunches it as needed to process requests.
In addition to the launch-on-demand feature, launchd provides the following benefits to daemon developers:
Simplifies the process of making a daemon by handling many of the standard housekeeping chores normally associated with launching a daemon.
Provides system administrators with a central place to manage daemons on the system.
Supports inetd -style daemons.
Eliminates the primary reason for running daemons as root. Because launchd runs as root, it can create low-numbered TCP/IP listen sockets and hand them off to the daemon.
Simplifies error handling and dependency management for inter-daemon communication. Because daemons launch on demand, communication requests do not fail if the daemon is not launched. They are simply delayed until the daemon can launch and process them.
The launchd Startup Process
After the system is booted and the kernel is running, launchd is run to finish the system initialization. As part of that initialization, it goes through the following steps:
It loads the parameters for each launch-on-demand system-level daemon from the property list files found in /System/Library/LaunchDaemons/ and /Library/LaunchDaemons/ .
It registers the sockets and file descriptors requested by those daemons.
It launches any daemons that requested to be running all the time.
As requests for a particular service arrive, it launches the corresponding daemon and passes the request to it.
When the system shuts down, it sends a SIGTERM signal to all of the daemons that it started.
The process for per-user agents is similar. When a user logs in, a per-user launchd is started. It does the following:
It loads the parameters for each launch-on-demand user agent from the property list files found in /System/Library/LaunchAgents , /Library/LaunchAgents , and the user’s individual Library/LaunchAgents directory.
It registers the sockets and file descriptors requested by those user agents.
It launches any user agents that requested to be running all the time.
As requests for a particular service arrive, it launches the corresponding user agent and passes the request to it.
When the user logs out, it sends a SIGTERM signal to all of the user agents that it started.
Because launchd registers the sockets and file descriptors used by all daemons before it launches any of them, daemons can be launched in any order. If a request comes in for a daemon that is not yet running, the requesting process is suspended until the target daemon finishes launching and responds.
If a daemon does not receive any requests over a specific period of time, it can choose to shut itself down and release the resources it holds. When this happens, launchd monitors the shutdown and makes a note to launch the daemon again when future requests arrive.
Important: If your daemon shuts down too quickly after being launched, launchd may think it has crashed. Daemons that continue this behavior may be suspended and not launched again when future requests arrive. To avoid this behavior, do not shut down for at least 10 seconds after launch.
Creating a launchd Property List File
To run under launchd , you must provide a configuration property list file for your daemon. This file contains information about your daemon, including the list of sockets or file descriptors it uses to process requests. Specifying this information in a property list file lets launchd register the corresponding file descriptors and launch your daemon only after a request arrives for your daemon’s services. Table 5-1 lists the required and recommended keys for all daemons.
The property list file is structured the same for both daemons and agents. You indicate whether it describes a daemon or agent by the directory you place it in. Property list files describing daemons are installed in /Library/LaunchDaemons , and those describing agents are installed in /Library/LaunchAgents or in the LaunchAgents subdirectory of an individual user’s Library directory. (The appropriate location for executables that you launch from your job is /usr/local/libexec .)