Кто-нибудь может порекомендовать хороший учебник для написания (с нуля) запускаемой работы в стиле cron?

19

У меня довольно простая работа, которую я хотел бы выполнять каждый час. Я мог бы сделать это, используя cron, но я думал, что буду использовать это, чтобы узнать об этом launchd, так как я слышу хорошие вещи об этом. У меня есть man launchd.plistстраница в качестве ссылки, но я ищу что-то более основанное на создании примера работы.

Хэнк Гей
источник
Это должно быть перемещено в Stackoverflow.
Филипп Реган
5
@Philip Regan Я думал об этом, но для меня не так уж много программирования. Если бы я задавал cronвопрос, разве superuser.com не был бы правильным местом? Так launchdкак это версия Apple cron(а также daemontoolsи, возможно, другие вещи), я подумал, что это мой лучший вариант.
Хэнк Гей
Вы также можете поместить его в скрипт
automator
По иронии судьбы, через три года мне нужно было самостоятельно внедрить процесс cron / launchd, и я снова увидел этот вопрос в совершенно ином свете. У Stack Overflow неоднозначное мнение о том, что делать с запущенными вопросами, но им действительно не нравятся эти вопросы. Просто думал, что вся ситуация была забавной. +1
Филип Риган

Ответы:

14

launchdзапускает Daemons ( /Library/LaunchDaemonsили /System/Library/LaunchDaemons) от имени пользователя root и запускает их независимо от того, вошли пользователи или нет. Агенты запуска ( /Library/LaunchAgents/или ~/Library/LaunchAgents/) запускаются, когда пользователь вошел в систему как этот пользователь. Вы не можете использовать setuid для смены пользователя, запускающего скрипт на демонах. /SystemКаталог зарезервирован для Mac OS X задач , поэтому я рекомендую положить ваш launchdplists в либо /Libraryили ~/Libraryпапку , как это имеет смысл.

Итак, первый шаг - определить, делаете ли вы агент или демон.

Второй шаг - создать .plistфайл. Вы можете использовать программы на основе графического интерфейса, такие как Lingon, чтобы помочь с этим или просто использовать ваш любимый текстовый редактор:

Пример .plistдля запуска скрипта каждый час ( StartIntervalили StartIntervalCalendarэто ключи, которые мы хотим - StartIntervalчтобы элемент происходил каждые xсекунды, StartIntervalCalendarв течение определенного времени и / или даты. См. 126907 для SuperUser для примера, который я сделал с StartCalendarInterval):

<?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>OnDemand</key>
    <true/>
    <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>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

Измените, .plistесли необходимо, указать свой сценарий и все необходимые аргументы (аргументы указаны в отдельных строках) и сохраните файл с тем же именем, что и значение Label, но .plistв конце с. (например, local.my-mac.flickrstatsбудет сохранен как local.my-mac.flickrstats.plist). Если вы еще этого не сделали, переместите этот .plistфайл во /Library/LaunchDaemonsвремя создания демона (выполняется постоянно) или в ~/Library/LaunchAgents(только если вы вошли в систему) или /Library/LaunchAgents(любой пользователь вошел в систему).

Для запуска задания, которое вы хотите запустить, launchctlнеобходимо загрузить файл. Для элементов в /Library, вы должны использовать sudo: например,sudo launchctl load -w /PATH/TO/PLIST

Для справки также ознакомьтесь со следующими вопросами о суперпользователе : команда Launchd от имени пользователя root , загрузка системного демона и как заставить скрипт запускаться каждый день

Chealion
источник
4

Я знаю, что это не очень хороший учебник, но вы можете взглянуть на Руководство по программированию Daemons and Services от Apple, в котором есть раздел «Планирование временных заданий».

Я знаю, что это не полный учебник, но с его помощью вы можете понять основы launchd.

Также приведен пример crondзадачи:

<?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.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>
Studer
источник
Я понизил голосование, потому что вы признали, что ресурс не тот, о котором я просил, и это показалось мне немного RTFM, но я переосмыслил это и хотел бы отменить свое понижение. К сожалению, я не могу, если вопрос не отредактирован (он был слишком длинным), и у меня еще недостаточно представителей для редактирования. Не могли бы вы что-нибудь настроить? Благодарю.
Хэнк Гей
@ Хэнк Гей: Спасибо за ваш комментарий. Я также отредактировал свой ответ.
Студер
4

Это мне очень помогло: http://launchd.info

Он охватывает настройку, администрирование и устранение неполадок с использованием терминала или запуска LaunchControl с графическим интерфейсом . Примеры предоставляются также.

khowl
источник
2

Я знаю, что вы искали учебник, но по случайности кто-то приходит сюда в поисках инструмента, помогающего им создавать / редактировать записи запуска, я использовал его раньше: Lingon (sourceforge)

Это больше не активно развивается, но то, что там работает, (и, конечно, включает в себя источник и т. Д.) Я использовал его на Snow Leopard для планирования резервного копирования в облако Amazon и т. Д.

robsoft
источник
Lingon сейчас в App Store, поэтому все еще активен, но не свободен, смотрите < peterborgapps.com/lingon >
user151019
Версия магазина приложений была нарушена требованиями политики Apple. Предварительно скомпилированная версия SourceForge работает хорошо - хотя модальное диалоговое окно при сохранении, предлагающее выйти из системы или перезапустить его, чтобы демон не исчез. Мне пришлось выйти из программы из ее меню (не принудительно выйти) и проверить, чтобы убедиться, что он сохранил файл правильно. Урезанный в этом триггере файла и каталога не поддерживается, и невозможно создать что-то, что запускается как root с версией AppStore.
marfarma