Я не могу запланировать периодический запуск с launchctl
/ launchd
на OS X (Leopard). По сути, я не могу найти пошаговый список инструкций в Интернете, и интуитивный подход не работает.
sync.plist
Файл:
<?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>net.madrat.utils.sync</string>
<key>Program</key>
<string>rsync</string>
<key>ProgramArguments</key>
<array>
<string>-ar</string>
<string>/path/to/folder/</string>
<string>/path/to/backup/</string>
</array>
<key>StartInterval</key>
<integer>7200</integer>
</dict>
</plist>
Я поместил этот скрипт в путь ~/Library/LaunchAgents
.
Далее я зарегистрировал скрипт, используя
launchctl load ~/Library/LaunchAgents/sync.plist
Наконец, чтобы проверить, что это работает, я начал работу:
launchctl start net.madrat.utils.sync
- Ничего не произошло. Выполнение rsync
команды в терминале вручную дает ожидаемый результат.
Я вполне уверен, что задание было зарегистрировано правильно, потому что, если я пытаюсь запустить несуществующее задание, я получаю сообщение об ошибке (которого я не получил в приведенной выше команде).
Что я сделал не так?
launchctl list
сделал дисплей 1, но только после того, как я начал агент вручную с помощьюlaunchctl start
.Длинный ответ:
Трудно работать с launchd без понимания некоторых основных принципов. Так что, скорее всего, вы не найдете пошаговую инструкцию, у нее столько возможностей. Хорошим шагом будет руководство по началу работы на АЦП: http://developer.apple.com/macosx/launchd.html
Вы также можете прочитать страницы руководства для
launchd
,launchctl
и .plist синтаксис файлов,launchd.plist
.Часто возникает недоразумение, куда поместить вашего агента или демона, поэтому позвольте мне рассказать об этом здесь:
Короткий ответ:
Возможно, имя вашего plist-файла неверно, сейчас я не могу его проверить, но я бы установил его
net.madrat.utils.sync.plist
. Также может быть полезно сначалаunload
загрузить свой демон перед загрузкой, если вы отредактировали файл.источник
launchd bash
для отладки - но она не работает на Leopard (launchd
не может быть запущена напрямую).Я не могу найти документацию, что это на самом деле стандартное поведение, но кажется, что launchd требует абсолютных путей в файлах plist. Так что попробуйте
/usr/bin/rsync
вместо этого. Работает для меня!источник
попробуйте это, мои сценарии работают без использования программной части, просто программные аргументы ...
замещать
с
источник
попробуйте добавить эти ключи в ваш файл plist
источник
В вашем файле .plist есть одна неправильная вещь и одна хитрая (каждая из этих точек была затронута в предыдущих ответах; я собираю их здесь).
Вы бы лучше написали:
Первым аргументом в
ProgramArguments
массиве является программа, которую нужно выполнить - вы бы ее пропустили. ЕслиProgram
ключ опущен, то по умолчанию используется первый аргументProgramArguments
; вероятно, целесообразно указать это только один раз.Поскольку вы пропустили этот первый аргумент, ваш .plist будет вызывать rsync (через имя в
Program
), но «первый аргумент» rsync был бы/path/to/folder
, а не-ar
(запущенная программа будет очень кратко видна вps
выходных данных, прежде чем она выйдет с ошибка, но названная как-ar
, что является содержанием нулевого аргумента).Вам не нужно указывать путь к нему
rsync
, но в этом контексте, вероятно, целесообразно сделать это, чтобы не полагаться на то,PATH
что он установлен соответствующим образом.Документация для этого находится в
launchd.plist(5)
. Обратите внимание, что на этой странице подчеркивается, что значениеProgramArguments
ключа передаетсяexecvp(3)
. Этоexecvp
страница руководства, которая объясняет поиск PATH.источник