Запускаем программы при запуске Mac OS X — Launchd

    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 — уникальный идентификатор.
    <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.
    Программа 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, но она решилась способом, который я описал выше, т.е. вызовом напрямую процесса.

    Ссылки

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 709 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 17

      +1
      А что, настроить автозапуск прог с помощью стандартных утилит Mac уже неактуально?
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          Системные настройки > Учетные записи > Объекты входа
            0
            И что вы там укажете? Просто приложение и все? Это утилита для «пользователя», а не для разработчика.
              0
              Консоль полностью в вашем распоряжении.
                0
                Что вы хотите сказать? Выражайтесь нормально. И что консоль? Что дальше?
                  0
                  Новичкам эта прога может и пригодиться, но те, кто может отличить зомби от демона, вполне обходятся обычной консолькой.
                    0
                    Вы о чем вообще? Новичкам пригодится launchd? Программа с помощью которой загружается и работает Mac OS X?
                    Консоль консоль вы заладили. Расскажите тогда как вы запустили бы 10 процессов php-cgi при старте системы и следили бы за тем чтобы они не упали?
                • НЛО прилетело и опубликовало эту надпись здесь
              • НЛО прилетело и опубликовало эту надпись здесь
              +1
              Подскажите какие это «стандартные» вы имеете ввиду?
              Автозапуск программ типа сафари или itunes это одно, а другое дело это запускать демонов и поддерживать их в запущенном состоянии. Или например загружать скрипт который должен запуститься несмотря на то что никто не залогинился. И тд и тому подобное.
              0
              хм. поправьте, если я не прав, но получается, что можно полностью загрузить веб-сервер с субд и php даже в том случае, когда ни один из пользователей не залогинился в систему? Если такой вариант возможен, то это идеальный вариант для домашнего хостинга (для собственного блога например).
                0
                Да вы полностью правы. Я впринципе это и сделал у себя :)
                Для этого только надо создать файл в папке /System/Library/LaunchDaemons
                  0
                  в таком случае это чертовски круто!
                    0
                    Некоторые так не думают. Собрал уже -7 ) Хорошо хоть кому то помог.
                0
                Странно, что заминусовали…
                Спасибо!
                  0
                  а вот собственно и видео launchd:
                  video.google.com/videoplay? docid=1781045834610400422

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое