Ответ 1
Просто используйте 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/
где ~ - ваш каталог HOME. Эта задача будет выполняться с вашими привилегиями, так же, как если бы вы запустили их самостоятельно по командной строке или дважды щелкнув файл в Finder.
Обратите внимание, что существует также /System/Library/LaunchDaemons
и /System/Library/LaunchAgents
, но, как обычно, все под /System
управляется OS X. Вы не должны размещать там какие-либо файлы, вы не должны менять файлы там, если вы действительно знайте, что вы делаете. Прошивка в папке "Системы" может сделать вашу систему непригодной (переведите ее в состояние, когда она даже откажется загрузиться снова). Это каталоги, в которых Apple размещает задачи launchd
, которые запускают и запускают вашу систему во время загрузки, автоматически запускают службы по мере необходимости, выполняют задачи обслуживания системы и т.д.
Каждая задача launchd
есть файл в формате plist. Он должен иметь обратную регистрацию имени домена. Например. вы можете назвать свою задачу
com.example.my-fancy-task.plist
Этот 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>
Этот агент будет запускать оболочку script/usr/local/bin/my-script.sh каждые 1800 секунд (каждые 30 минут). Вы также можете запускать задание в определенные даты/время (в основном, запуск может делать все, что может сделать 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)