Как мне установить задачу для запуска так часто?


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

7 60

7 ответов:

просто использовать 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

этот plist может иметь различные параметры и настройки. Написание одного на руку является неоптимальным, вы можете получить бесплатный инструмент брусники для создания ваших задач. Этот инструмент раньше был бесплатным, теперь он стоит $ 5 в app store и $10 в качестве версии без app store (версия без app store намного мощнее и если вы уже планируете платить за это, серьезно, получите версию без app store). Если кто-нибудь знает сопоставимый инструмент, который является бесплатным или открытым исходным кодом, напишите Мне строку в комментариях, и я скорее рекомендую ее (не хочу рекламировать здесь коммерческое программное обеспечение).

просто в качестве примера, это может выглядеть так

<?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>

команда может быть load или unload, чтобы загрузить plist или выгрузить его снова, в этом случае параметром является путь к файлу. Или команда может быть start или stop, чтобы просто запустить или остановить такую задачу, в этом случае параметр-это метка (com.example. my-fancy-task). существуют также другие команды и параметры.

см. документацию Apple по формат plist и launchctl командная строка (обратите внимание, что вы можете выбрать версию OS X сверху, так как формат / параметры различаются между различными выпусками OS X)

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

Это даст вам оболочку один лайнер, чтобы зарегистрировать новое запланированное задание с уже рекомендованным launchd

на MacOSX, у вас есть по крайней мере следующие варианты:

  • повторяющийся iCal-сигнал тревоги с действием "Run Script"
  • launchd
  • cron (link1,link2)

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

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

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

[СНиП...]

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

Mac имеет инструмент Automator, который такой же, как у планировщика задач в windows. Но с помощью Automator вы можете запланировать задачу на ежедневной основе и связать задачу с повторяющимся событием календаря для запуска скриптов в указанное время ежедневно. см. ссылку для запуска скриптов на ежедневной основе в Mac OS

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

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