Просто используйте launchd. Это - очень мощная система средства запуска, и между тем это - стандартная система средства запуска для Mac OS X (текущая версия OS X даже не загрузилась бы без него). Для тех, кто не знаком с launchd
(или с OS X в целом), он похож на гибрид между init
, cron
, at
, SysVinit (init.d
), inetd
, upstart
и systemd
. При заимствовании понятия всех этих проектов все же также предложении вещей Вы не можете найти в другом месте.
Каждый сервис/задача является файлом. Местоположение файла зависит от вопросов: "Когда эта услуга, как предполагается, работает?" и, "В котором будут нужны полномочия сервис?"
Системные задачи переходят в [1 132]
/Library/LaunchDaemons/
, если они должны работать, неважно, если в какого-либо пользователя войдут система или нет. Они будут запущены с "корневых" полномочий.
, Если они должны только работать, если какой-либо пользователь будет зарегистрирован, они переходят в [1 134]
/Library/LaunchAgents/
и будут выполняться с полномочиями пользователя, который просто вошел в систему.
, Если они должны работать, только если Вы зарегистрированы, они переходят в [1 136]
~/Library/LaunchAgents/
, где ~ является Ваш Корневой каталог. Они определяют задачу, будет работать с Вашими полномочиями, так же, как если бы Вы запустили их сами командной строкой или путем двойного щелчка по файлу в Средстве поиска.
Примечание, которое там также существует /System/Library/LaunchDaemons
и /System/Library/LaunchAgents
, но как обычно, всем под [1 116] управляет OS X. Вы не должны помещать файлы туда, Вы не должны изменять файлы там, если Вы действительно не будете знать то, что Вы делаете. Бездельничание в папке Systems может сделать Вашу систему неприменимой (получите его в состояние, где это даже откажется загружаться снова). Это каталоги, куда Apple помещает launchd
задачи, которые будят Вашу систему и работающий во время начальной загрузки, автоматически запускают сервисы как требуется, выполняют задачи обслуживания системы и так далее.
Каждый launchd
задачей там является файл в формате plist. Это должно иметь обратную нотацию доменного имени. Например, можно назвать задачу
com.example.my-fancy-task.plist
, Этот plist может иметь различные варианты и настройки. Запись один на руку является субоптимальной, можно хотеть заставить бесплатный инструмент Lingon создавать задачи. Этот инструмент раньше был свободен, теперь он стоит 5$ в App Store, и 10$ как не версия App Store (не версия App Store намного более мощна и если Вы уже планируете оплату его, серьезно, получаете не версию App Store). Если кто-либо знает сопоставимый инструмент, который является бесплатным программным обеспечением или открытым исходным кодом, напишите мне в комментариях, и я скорее рекомендую, что один (не хотят рекламировать здесь для коммерческого программного обеспечения).
Так же, как пример, это могло быть похожим на это
Label
com.example.my-fancy-task
OnDemand
ProgramArguments
/bin/sh
/usr/local/bin/my-script.sh
StartInterval
1800
, Этот агент будет выполнять сценарий оболочки/usr/local/bin/my-script.sh каждые 1800 секунд (каждые 30 минут). Можно было также работать на задаче определенные даты/времена (в основном launchd, может сделать все, что крон может сделать), или можно даже отключить "OnDemand" порождение launchd для хранения постоянно рабочего процесса (если это выйдет или откажет, то launchd сразу перезапустит его). Можно даже ограничить, сколько ресурсов может использовать процесс (как сказано прежде, Lingon показывает все эти настройки в хорошем интерфейсе UI).
Обновление: Даже при том, что OnDemand
все еще поддерживается, это удерживается от использования. Новую установку называют KeepAlive
, который имеет намного больше смысла. Это может иметь булево значение, в этом случае это - полная противоположность [1 121] (установка, это к [1 122] ведет себя, как будто OnDemand
true
и наоборот). Большая новая возможность, что она может также иметь значение словаря вместо булева. Если это имеет значение словаря, у Вас есть несколько дополнительных опций, которые дают Вам больше мелкозернистого контроля, под которым обстоятельствами должна быть поддержана задача. Например, это только поддерживается пока программа, завершенная с кодом выхода нуля, только, пока определенный файл/каталог на диске существует, только если другая задача также жива, или только если сеть в настоящее время.
Также можно вручную позволить/запретить задачи через командную строку:
launchctl
команда может быть загрузкой или разгрузиться, чтобы загрузить plist или разгрузить ее снова, в этом случае параметр является путем к файлу. Или команда может быть запуском или остановкой, чтобы только запустить или остановить такую задачу, в этом случае параметр является маркировкой (com.example.my-fancy-task). Другие команды и опции существуют также.
Видят документацию Apple plist формат , и launchctl
инструмент командной строки (обратите внимание, что можно выбрать версию OS X на вершине, так как формат/опции действительно варьируется между различными выпусками OS X)
Если вы знаете, что два столбца из вашего результата всегда напрямую связаны между собой, тогда сделать это медленнее:
SELECT DISTINCT CustomerId, CustomerName FROM (...)
, чем это:
SELECT CustomerId, CustomerName FROM (...) GROUP BY CustomerId
, потому что во втором случае нужно сравнивать только идентификатор, а в первом случае нужно сравнивать оба поля. Это особый прием MySQL. Он не будет работать с другими базами данных.
SELECT Code
FROM YourTable
GROUP BY Code
vs
SELECT DISTINCT Code
FROM YourTable
Основное правило: поместите все столбцы из предложения SELECT в предложение GROUP BY
, чтобы
SELECT DISTINCT a,b,c FROM D
превратилось в
SELECT a,b,c FROM D GROUP BY a,b,c