
Я не могу запланировать периодический запуск с 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
команды в терминале дает ожидаемый результат.
Я почти уверен, что задание было зарегистрировано правильно, потому что если я попытаюсь запустить несуществующее задание, я получу сообщение об ошибке (которое яне сделалполучить в приведенной выше команде).
Что я сделал не так?
решение1
лингонхороший графический инструмент для управления launchd. Проект, похоже, больше не поддерживается... но он определенно все еще работает на 10.5.x.
Но что касается вашей конкретной проблемы... вы пробовали
sudo launchctl list
Это скажет вам, правильно ли запускается .plist. Он вернет 1, если демон не запускается, и '0', если он успешен. Может быть, стоит поискать это.
Если я вижу «1», это обычно означает, что я поместил скрипт в неправильное место, сделал опечатку или неправильно установил разрешения.
Также... часто перезагружается. Я видел
launchctl start
не будет эффективным там, где перезагрузка была ..
Кроме того, если рассмотреть ваш вопрос поближе... почему бы просто не поместить этот код rsync в скрипт bash... и не вставить его /usr/bin/
... Тогда вы могли бы просто chmod+x
этот файл... и упростить ваш .plist, чтобы запускать этот скрипт, когда захотите...
решение2
Длинный ответ:
Трудно работать с launchd, не понимая некоторых базовых принципов. Поэтому, скорее всего, вы не найдете никаких пошаговых инструкций, у него так много возможностей. Хорошим шагом будет обратиться к руководству по началу работы с ADC:http://developer.apple.com/macosx/launchd.html
Вы также можете прочитать страницы руководства для launchd
и launchctl
синтаксис файлов .plist, launchd.plist
.
Часто возникает недопонимание относительно того, куда поместить своего агента или демона, поэтому позвольте мне разместить здесь некоторую информацию по этому поводу:
- Если ваше задание должно выполняться даже тогда, когда ни один пользователь не вошел в систему, поместите его в /Library/LaunchDaemons.
- Если он полезен только тогда, когда пользователи вошли в систему, поместите его в /Library/LaunchAgents или в личные каталоги LaunchAgents конкретных пользователей (~/Library/LaunchAgents).
- Не помещайте свою задачу в /System/Library, который зарезервирован для системных демонов.
~/Library/LaunchAgents Per-user agents provided by the user. /Library/LaunchAgents Per-user agents provided by the administrator. /Library/LaunchDaemons System wide daemons provided by the administrator. /System/Library/LaunchAgents Mac OS X Per-user agents. /System/Library/LaunchDaemons Mac OS X System wide daemons.
Короткий ответ:
Имя вашего plist-файла может быть неправильным, сейчас не могу проверить, но я бы установил его на net.madrat.utils.sync.plist
. Также может быть полезно сначала указать unload
ваш демон перед загрузкой, если вы редактировали файл.
решение3
Я не могу найти документацию, что это на самом деле стандартное поведение, но похоже, что launchd требует абсолютных путей в plist-файлах. Так что попробуйте /usr/bin/rsync
вместо этого. У меня работает!
решение4
попробуйте добавить эти ключи в ваш plist-файл
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>