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


Відповіді:


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>

Команда може бути завантажити або розвантажити, щоб завантажити plist або вивантажити його знову, і в цьому випадку параметром є шлях до файлу. Або командою може бути start або stop, щоб просто запустити або зупинити таке завдання, у цьому випадку параметром є мітка (com.example.my-fancy-task). Існують також інші команди та параметри.

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


Що робити, якщо я як користувач хочу, щоб щось запускалось, навіть коли я не ввійшов в систему? Чи можливо це, чи я повинен просити адміністратора помістити щось у / Library / LaunchDaemons?
Mark Baker

@Mark: так, це повинен зробити ваш адміністратор, а ключі UserName та GroupName повинні бути належним чином встановлені у файлі .plist.
Стів Фоллі

Також зверніть увагу, що для Leopard і пізніше OnDemand застаріло на користь ключа KeepAlive. man launchd.plist для детальнішої інформації.
Стів Фоллі

1
LaunchControl soma-zone.com/LaunchControl дуже корисний, він має необмежену пробну версію, наскільки я можу зрозуміти, що немає обмежень щодо ліцензійної версії.
BaneOfSerenity

1
@MaciekRek StartCalendarIntervalз масивом із двох словників, як із ключем, так Minuteі зі значенням раз 00і раз 30, зробить саме те, що ви просили. Будь ласка, задавайте питання надалі як запитання, а не як коментарі, тоді я також можу показати вам остаточний словник (я не можу це зробити в коментарі). Цей сайт - це все про те, щоб задавати питання. Якщо ви хочете натякнути комусь на питання, опублікуйте посилання на запитання як коментар, але не саме питання.
Мекі

46

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

це дасть вам оболонку з одним вкладишем, щоб зареєструвати нове заплановане завдання з уже рекомендованим launchd


11

У MacOSX у вас є принаймні такі параметри:

  • Повторюваний сигнал тривоги iCal із дією "Виконати сценарій"
  • запускd
  • хрон ( link1 , ссилка2 )

З особистого досвіду, cron є найнадійнішим. Коли я тестував, у launchd було кілька помилок та химерностей. Сигнали iCal спрацьовують лише тоді, коли ви ввійшли в систему (але це, можливо, вам подобається).


8

Як зазначив Мецкі, шлях до цього можна було б здійснити launchd. Існує інтерфейс графічного інтерфейсу для launchd під назвою Lingon, який ви можете перевірити, на відміну від редагування файлів launchd вручну:

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

[знімок ...]

Редагувати файл конфігурації простіше, ніж будь-коли в цій версії, і він має два різних режими. Основний режим, який має найпоширеніші налаштування, доступні в дуже простому інтерфейсі та Експертний режим, де ви можете додати всі налаштування або безпосередньо в текст, або вставити їх через меню.


Чесно кажучи, це чудовий, простий у використанні інтерфейс, який просто робить це і дозволяє рухатися далі. Якщо у вас недостатньо часу, це такий шлях.
Джошуа Пінтер

4

MAC OS має інструмент автоматизації, який є таким же, як у Планувальника завдань у вікнах. А за допомогою Automator ви можете щоденно планувати завдання та пов'язувати завдання з періодичною подією календаря, щоб запускати сценарії щодня в заданий час. посилання для запуску сценаріїв щодня в Mac OS


Принаймні в macOS Catalina (10.15.x) я не міг знайти спосіб планування завдань у Календарі через Automator. Я мав набагато кращі результати з Lingon (див. Інші відповіді, які згадуються як інтерфейс для launchd).
calvinf

2

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


1

FYI: хоча я сумую за цим, це простота, cron залишилася в минулому в OS X. Це був сторожовий собака на пантері. З часу Тигра він був запущений. Отже, якщо ви використовуєте Leopard cron, це не варіант.


0

Ви можете використовувати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.