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

84

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

сталепретцель
источник

Ответы:

136

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

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

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

Mecki
источник
Что, если я как пользователь хочу, чтобы что-то запускалось, даже если я не вошел в систему? Возможно ли это, или мне нужно попросить администратора поместить что-то в / Library / LaunchDaemons?
Марк Бейкер,
@Mark: да, ваш администратор должен будет это сделать, а ключи UserName и GroupName должны быть соответствующим образом установлены в файле .plist.
Стив Фолли,
Также обратите внимание, что для Leopard и последующих версий OnDemand устарел в пользу ключа KeepAlive. man launchd.plist для получения более подробной информации.
Стив Фолли,
1
LaunchControl soma-zone.com/LaunchControl очень полезен, у него есть неограниченная пробная версия, насколько я могу судить, нет никаких ограничений по сравнению с лицензионной версией.
BaneOfSerenity
1
@MaciekRek StartCalendarIntervalс массивом из двух словарей, как с ключом Minuteи значением один раз 00и один раз 30будет делать именно то , что вы просили. Пожалуйста, задавайте вопросы в будущем как вопросы, а не как комментарии, тогда я также могу показать вам окончательный словарь (я не могу сделать это в комментарии). Этот сайт предназначен для того, чтобы задавать вопросы. Если вы хотите намекнуть на вопрос, опубликуйте ссылку на вопрос как комментарий, а не сам вопрос.
Mecki
46

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

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

Космотавр
источник
11

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

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

Бруно де Фрайн
источник
8

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

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

[отрывок ...]

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

Джей
источник
Честно говоря, это отличный, простой в использовании интерфейс, который просто выполняет свою работу и позволяет двигаться дальше. Если у вас мало времени, это то, что вам нужно.
Джошуа Пинтер
4

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

Jlearner
источник
По крайней мере, в macOS Catalina (10.15.x) я не мог найти способ планировать задачи в Календаре через Automator. У меня были намного лучшие результаты с Lingon (см. Другие ответы, которые упоминаются как интерфейс для запуска).
calvinf
2

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

Майк Хайнц
источник
1

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


источник
1

Вы можете использовать cron для планирования задач.

crontab -e

Задание указывается в следующем формате.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

Пример:

0 12 * * *  cd ~/backupfolder && ./backup.sh

После того, как вы установили свои задачи cron, вы можете использовать crontab -l для вывода списка своих задач.

crontab -l

Если вы хотите узнать больше о выражениях расписания cron, вы можете получить доступ к

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

UnchartedWorks
источник