Как зарегистрировать агента с помощью launchd

Как зарегистрировать агента с помощью launchd

Я не могу запланировать периодический запуск с 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/>

Связанный контент