Как я могу заставить скрипт запускаться каждый день на Mac OS X?


Ответы:


62

Для справки, все 3 варианта будут работать. Однако опция iCal имеет больше ограничений, чем другие.

(Есть графические интерфейсы для редактирования cron и launchd, как упоминалось в других ответах)

Cron - самый прямой и хорошо известный, и есть много доступных учебников. Coles Notes должен добавить последнюю строчку снизу к вашему crontab (редактируя /etc/crontabили используя crontabв командной строке):

MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
MM HH * * * USERNAME /PATH/TO/SCRIPT
00 3 * * * chealion /myscript.sh "Runs at 03:00 every day"

В Mac OS X cronфактически был заменен, launchdно launchdобратно совместим со cronзначением, которое вы все еще можете использовать, cronно он фактически launchdвыполняет всю работу.

Если вы хотите использовать, launchdвы также можете проверить другие вопросы здесь, в Super User: (например, как я запускаю команду launchd от имени root? ), Где вы хотите сохранить свой файл конфигурации (файл plist) а когда он запускается, зависит от того, в каком каталоге он хранится и как он загружается (например, использовали ли вы sudo или нет) - аналогично cron.

Ниже приведен пример ежедневного запуска launchd plist (убедитесь, что файл и метка совпадают - за исключением plist для метки) - этот скрипт запускается ежедневно в 3 минуты после полуночи:

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>03</integer>
    </dict>
</dict>
</plist>

Стоит также отметить, что запускаемые задачи, если они были запланированы на то время, когда компьютер спит или выключен, будут запускаться, когда компьютер снова станет доступным (его включение или пробуждение) - хотя только один раз, независимо от того, сколько дней он может иметь было. Изменить: Я только что был в документе Apple, в котором говорилось, что если машина выключена, то вы потеряете все события запуска в течение этого времени, (ваш скрипт не запустится при запуске), (сон запускает скрипт при пробуждении)


Другой вариант - использовать « at » (проверьте страницу руководства с «man at»). Скрипт может перепланировать себя, например:

echo "sh $0 $@" | at `date +%H:%M` tomorrow

(используйте «+ 10 минут» вместо «завтра», чтобы запускать его каждые 10 минут; чтобы остановить планирование, просто выполните «at -l», чтобы получить список идентификаторов запланированного задания, а затем «at -r id », чтобы удалить задание).

Возможно, вам придется сначала запустить соответствующий демон (atrun) с (см. Https://superuser.com/a/43680 ):

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

Преимущества: быстрое исправление, не требуется доступ sudo / root, простое создание сложных шаблонов расписаний. Недостаток: нестандартный метод планирования для OS X (который запускается)


8
Сэр, для вашего примера запустил конфигурационный файл, я могу поцеловать вас. Но я не буду.
Пол Д. Уэйт

5
launchdэто путь под OS X.
zneak

Да, это было мое впечатление. Похоже, что в Tiger возникли некоторые проблемы, но с тех пор Apple, похоже, обострила их.
Пол Д. Уэйт

На Os 10.7.4 нет файла / etc / crontab. ): Итак, я сделал «какой crontab», и это дало мне / usr / bin / crontab, но это искаженный файл.
Герман Ингальдссон

@HermannIngjaldsson / usr / bin / crontab - это программа; если вы запустите его в терминале с помощью crontab -e, он перейдет в текстовый редактор на основе терминала для файла, который станет вашим личным crontab при сохранении.
Марк Рид

8

LaunchControl - еще один графический интерфейс для launchd / launchctl. Хотя альтернативы, упомянутые другими, вполне способны запускать сценарий ежедневно, с помощью LaunchControl вы можете настраивать сложные расписания (например, «один раз в будний день, в выходные дни каждый час между 14:00 и 20:00»). Также это (AFAIK) единственный инструмент, который фактически проверяет работу. Если работа не работает должным образом, это покажет вам, почему.

Попробовать можно столько времени, сколько вы хотите.


3
В то время как это можно бесплатно попробовать / использовать, разработчик предпочел бы, чтобы вы заплатили за лицензию. sites.fastspring.com/somazone/product/shop
Кент

1
Абсолютно. Причина, по которой я разместил этот ответ в первую очередь, заключалась в поддержке разработчика.
Марк Холл

5

CronniX - хороший интерфейс с графическим интерфейсом для планирования заданий cron на Mac ... Довольно приличный, если вы не хотите углубляться в документацию cron.


2
  • Для iCal вы можете прочитать эту статью .
  • Вы должны найти достаточно учебников, cronесли вы Google для этого.

Это зависит от того, что вы хотите: сценарии iCal будут выполняться только в том случае, если вы вошли в систему, cronвыполняет сценарий без входа в систему. Я не знаю, выполняет ли iCal сценарий, если Mac был выключен во время выполнения сценария был казнен. cronделает это


2

Обновление: вы можете проверить некоторые приложения в Mac OS X App Store, которые делают это:

Lingon также, по-видимому, доступен, в зависимости от того, какую ОС вы используете.



2

Вот простая бесплатная утилита для генерации plist XML:

http://www.gieson.com/Library/projects/utilities/launcha/

С помощью этой утилиты нет необходимости устанавливать программу, просто сохраните результаты в папке Library / LaunchAgents.


Предупреждение: если вы используете этот инструмент, убедитесь, что для RunAtStartнего установлено значение false (если вы не хотите, чтобы оно было истинным). Я потратил час на то, чтобы понять, почему мой Finder зависает и мешает загрузке рабочего стола при загрузке. Отключение RunAtStartне мешает фиксированному расписанию.
Андреа Лаззаротто

1

Я всегда использую Lingon для этого, но похоже, что он не в разработке. Вы можете попробовать Crontooie , но я никогда не использовал его лично. Или просто отредактируйте файл crontab в терминале.


Мне кажется, Lingon находится в стадии активного развития ; текущая версия 3 доступна в AppStore вместе с предыдущей версией 2. Оба стоят несколько долларов и получают очень смешанные отзывы. Лично я пользуюсь Lingon 3 с некоторым успехом, но не рекомендую его для этой цели по сравнению с другими инструментами, упомянутыми в других ответах (cron, at и т. Д.).
2013 года

В прошлый раз я использовал Lingon более 2 лет назад. В то время он работал нормально для меня, но я не использовал последние версии. Жаль, что это не так надежно, как раньше.
Джош

0
sp@mactop ~ $ crontab -l
*/5 * * * * /usr/local/bin/cinco.sh
sp@mactop ~ $ cat /usr/local/bin/cinco.sh
#!/bin/sh
....cut....
sp@mactop ~ $ 

... все командные строки, которые вы вводите для ".... cut ....", будут запускаться каждые пять минут.

30 лет прогресса, и «cron» до сих пор мой любимый планировщик.


0

Если событие календаря соответствует вашим потребностям, встроенное приложение Automator также позволяет создавать сигналы календаря, которые запускаются событиями календаря. Вы можете использовать некоторые встроенные действия на основе пользовательского интерфейса, чтобы делать то, что вы хотите, или вы также можете запустить какое-либо приложение или пользовательский AppleScript, JavaScript или сценарий оболочки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.