Просто используйте launchd . Это очень мощная система запуска, и в то же время это стандартная система запуска для Mac OS X (текущая версия OS X даже не загрузится без нее). Для тех, кто не знаком с launchd
(или с OS X в целом), это как скрещивание между init
, cron
, at
, SysVinit (init.d
), inetd
, upstart
и systemd
. Занимая концепции всех этих проектов, но также предлагая вещи, которые вы не найдете больше нигде.
Каждый сервис / задача - это файл. Расположение файла зависит от вопросов: «Когда этот сервис должен работать?» и "Какие привилегии понадобятся службе?"
Системные задачи перейти к
/Library/LaunchDaemons/
если они будут работать, независимо от того, вошел ли пользователь в систему или нет. Они будут запущены с привилегиями «root».
Если они запускаются, только если любой пользователь вошел в систему, они переходят на
/Library/LaunchAgents/
и будет выполняться с правами пользователя, который только что вошел в систему.
Если они будут работать, только если вы вошли в систему, они перейдут к
~/Library/LaunchAgents/
где ~ - ваш домашний каталог. Эти задачи будут выполняться с вашими привилегиями, как если бы вы запускали их самостоятельно из командной строки или дважды щелкнув файл в Finder.
Обратите внимание, что также существуют /System/Library/LaunchDaemons
и /System/Library/LaunchAgents
, но, как обычно, все в /System
управляется OS X. Вы не должны помещать туда какие-либо файлы, вы не должны изменять там какие-либо файлы, если только вы на самом деле знаю, что ты делаешь. Беспорядок в папке «Системы» может сделать вашу систему непригодной для использования (приведите ее в состояние, при котором она даже откажется загружаться снова). Это каталоги, в которые Apple помещает задачи launchd
, которые запускают и запускают систему во время загрузки, автоматически запускают службы по мере необходимости, выполняют задачи по обслуживанию системы и т. Д.
В каждой launchd
задаче есть файл в формате plist. Он должен иметь обратную запись доменного имени. Например. Вы можете назвать свою задачу
com.example.my-fancy-task.plist
Этот список может иметь различные параметры и настройки. Писать по одной на руку неоптимально, вы можете получить бесплатный инструмент Lingon для создания ваших задач. Раньше этот инструмент был бесплатным, теперь он стоит 5 долларов в магазине приложений и 10 долларов в качестве версии без магазина приложений (версия без магазина приложений гораздо более мощная, и, если вы уже планируете платить за нее, серьезно, приобретите магазин без приложений) версия). Если кто-то знает похожий инструмент, который является бесплатным или открытым, напишите мне в комментариях, и я рекомендую его (не хочу размещать здесь рекламу коммерческого программного обеспечения).
В качестве примера это может выглядеть так
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.my-fancy-task</string>
<key>OnDemand</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/usr/local/bin/my-script.sh</string>
</array>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>
Этот агент будет запускать сценарий оболочки /usr/local/bin/my-script.sh каждые 1800 секунд (каждые 30 минут). Вы также можете запускать задачу в определенные даты / время (в основном, launchd может делать все, что может сделать cron), или вы даже можете отключить «OnDemand», заставляя launchd поддерживать постоянный запуск процесса (если он завершается или падает, launchd немедленно перезапустит его) , Вы даже можете ограничить количество ресурсов, которое может использовать процесс (как уже было сказано, Lingon показывает все эти настройки в приятном интерфейсе пользовательского интерфейса).
Обновление: Несмотря на то, что OnDemand
все еще поддерживается, оно устарело. Новый параметр называется KeepAlive
, что имеет гораздо больше смысла. Он может иметь логическое значение, и в этом случае он является полной противоположностью OnDemand
(установка false
ведет себя так, как если бы OnDemand
равнялся true
, и наоборот). Отличная новая особенность заключается в том, что он может также иметь значение словаря вместо логического значения. Если он имеет значение словаря, у вас есть пара дополнительных опций, которые дают вам более точный контроль зерна, при каких условиях задача должна сохраняться. Например. он сохраняется только до тех пор, пока программа завершает работу с нулевым кодом завершения, только до тех пор, пока существует определенный файл / каталог на диске, только если другая задача также активна или только если сеть в данный момент работает.
Также вы можете вручную включать / отключать задачи через командную строку:
launchctl <command> <parameter>
Команду
можно загрузить или выгрузить, загрузить plist или выгрузить его снова, в этом случае параметром является путь к файлу. Или команда может быть запущена или остановлена, чтобы просто запустить или остановить такую задачу, в этом случае параметром является метка (com.example.my-fancy-task). Существуют и другие команды и опции.
См. Документацию Apple plist формата и launchctl
инструмента командной строки (обратите внимание, что вы можете выбрать версию OS X сверху, так как формат / опции делают различаются между различными выпусками OS X)