
Начнем с истории. Жили были десяток программ для запуска процессов или программ. И тысячи скриптов к ним. 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 — уникальный идентификатор.
<key>Label</key><string>php</string>
ProgramArguments — По сути это путь и параметры запускаемой программы.
Первая строка всегда путь к программе если не используется ключ Program.
Последующие строки будут параметрами. Каждый параметр и его значение лучше писать в разные строки.
<key>ProgramArguments</key>
<array>
<string>/opt/local/bin/php-cgi</string>
<string>-b 127.0.0.1:1026</string>
<string>-q</string>
</array>
OnDemand — Этот ключ говорит Launchd перезапустить процесс если он не запустился или упал. Так же устновив значение false говорит о том, что мы хотим чтобы процесс был запущен всегда.
<key>OnDemand</key>
<false/>
Теперь обернем это все в стандартную запись присутсвующую во всех файлах подобного типа.
<?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>php</string>
<key>ProgramArguments</key>
<array>
<string>/opt/local/bin/php-cgi</string>
<string>-b 127.0.0.1:1026</string>
<string>-q</string>
</array>
<key>OnDemand</key>
<false/>
</dict>
</plist>
Сохраним. Теперь Launchctl — это программа интерфейс для Launchd.
С помощью нее мы сможем включать или выключать загрузку нашего кофигурационного файла.
Например следующая команда включит наш файл.
sudo launchctl load -w /Library/LaunchDaemons/com.php-fcgi.plist
А эта выключит.
sudo launchctl unload -w /Library/LaunchDaemons/com.php-fcgi.plist
И добавит ключ с параметром в наш файл.
<key>Disabled</key><true/>
Вобщем теперь у нас при загрузке должно запускаться 5 процессов php-cgi. Перезапускать их можно командой
sudo launchctl stop php
а так как у нас стоит OnDemand false, то это просто перезапустит процесс.
Да чуть не забыл. Если вы хотите добавить переменные окружения, то надо написать примерно так
<key>EnvironmentVariables</key>
<dict>
<key>PHP_FCGI_CHILDREN</key>
<string>10</string>
<key>PHP_FCGI_MAX_REQUESTS</key>
<string>1000</string>
</dict>
А теперь бонусы
Для многих копаться в командной строке лень или сложно. Для них есть вариант полегче. Это бесплатная программа 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, но она решилась способом, который я описал выше, т.е. вызовом напрямую процесса.
Ссылки