Как мне поставить задачу так часто? - PullRequest
68 голосов
/ 25 сентября 2008

Как мне запускать скрипт каждые, скажем, 30 минут? Я предполагаю, что существуют разные способы для разных ОС. Я использую OS X.

Ответы [ 7 ]

108 голосов
/ 25 сентября 2008

Просто используйте 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)

36 голосов
/ 25 октября 2013

Вы можете использовать очень удобный генератор plist: http://launched.zerowidth.com/ (не нужно ничего покупать…)

это даст вам однострочник оболочки для регистрации нового запланированного задания с уже рекомендованным launchd

11 голосов
/ 25 сентября 2008

В MacOSX у вас есть как минимум следующие опции:

Из личного опыта, cron является самым надежным. Когда я тестировал, launchd имел ряд ошибок и изюминок. Сигналы тревоги iCal запускаются, только когда вы вошли в систему (но это может быть то, что вы предпочитаете).

6 голосов
/ 25 сентября 2008

Как указывал Меки, для этого нужно запустить launchd. Существует графический интерфейс для launchd, который называется Lingon , который вы, возможно, захотите проверить, а не редактировать файлы launchd вручную:

Lingon - графический пользовательский интерфейс для создания редактора. конфигурационные файлы для Mac OS X Leopard 10.5.

[чик ...]

Редактировать файл конфигурации проще, чем когда-либо в этой версии и у него есть два разных режима. Основной режим, который имеет наиболее распространенный настройки легко доступны в очень простом интерфейсе и режиме эксперта где вы можете добавить все настройки либо непосредственно в тексте, либо вставить их через меню.

3 голосов
/ 10 июня 2016

MAC OS имеет инструмент Automator , аналогичный инструменту Task Scheduler в Windows. А с помощью Automator вы можете ежедневно планировать задачи и связывать задачу с повторяющимся событием календаря, чтобы ежедневно запускать сценарии в указанное время. см. ссылку для ежедневного запуска сценариев в Mac OS

2 голосов
/ 25 сентября 2008

Для сценариев Apple я настроил специальный календарь iCal и периодически использую сигналы тревоги. Для инструментов командной строки я использую launchd.

1 голос
/ 13 мая 2009

К вашему сведению: хотя мне так не хватает его простоты, cron остался в прошлом на OS X. Это был сторожевой пес на пантере. Со времен Тигра он был запущен. Так что если вы используете Leopard cron, это не вариант.

...