Як зареєструвати агент при запуску


14

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

Я досить впевнений, що робота була зареєстрована правильно, оскільки якщо я спробую розпочати неіснуючу роботу, я отримаю повідомлення про помилку (якого я не отримав у вищевказаній команді).

Що я зробив не так?

Відповіді:


5

Lingon - це хороший інструмент GUI для управління запуском. Здається, проект зараз не підтримується ... але він безумовно все ще працює в 10.5.x.

Але до вашої конкретної проблеми ... ви намагалися

sudo launchctl list 

Це дозволить вам повідомити, чи правильно .plist запускає правильно. Він поверне 1, якщо демон не лачує, і "0", якщо він буде успішним. Можливо, шукайте цього.

Щоразу, коли я бачу "1", це зазвичай тому, що я поставив сценарій у неправильному місці, зробив друкарську помилку або встановив дозволи невірно.

Також .... перезавантажуйте часто .. Я бачив

launchctl start

не буде ефективним там, де перезавантаження було ..

Крім того, переглянувши ваше питання ближче .... чому б просто не ввести цей код rsync в скрипт bash ... і вставити його в /usr/bin/..... Тоді ви можете просто chmod+xцей файл .... і спростити свій .plist запускати цей сценарій, коли завгодно….


Дякую, помістивши команду в додатковий файл оболонки та запустивши, що зробило трюк. Це дуже незадовільне рішення, хоча ... чому не викликає команду безпосередньо? До речі, launchctl list показав 1, але тільки після того, як я запустив агент вручну, використовуючи launchctl start.
Конрад Рудольф

Я не позитивний, але я думаю, що запущені .plist файли дійсно призначені для визначення критеріїв "запуск на вимогу" для демонів ... Можливо, це було не впевнено, що робити з аргументами, які ви передали в <key> Аргументи програми </key>.
CaseyIT

11

Довга відповідь:

Важко працювати з запуском без розуміння деяких основних принципів. Тому, швидше за все, ви не знайдете жодної покрокової інструкції, у неї є стільки можливостей. Хороший крок - скористатися посібником із початку роботи на АЦП: http://developer.apple.com/macosx/launchd.html

Ви також можете прочитати сторінки керівництва для launchd, launchctlі .plist синтаксис файлів, launchd.plist.

Там часто виникають непорозуміння щодо того, куди поставити свого агента чи Деймона, тому дозвольте мені надіслати тут інформацію про це:

  • Якщо ваше завдання потрібно виконувати навіть тоді, коли жоден користувач не входить у систему, введіть його в / Library / LaunchDaemons.
  • Якщо він корисний лише під час входу користувачів, введіть його в / Бібліотека / LaunchAgents або в особисті каталоги LaunchAgents конкретних користувачів (~ / Бібліотека / LaunchAgents).
  • Не ставте свою роботу в / Система / Бібліотека, яка зарезервована для наданих системою демонів.
~/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.

Коротка відповідь:

Ім'я вашого списку файлів може бути неправильним, зараз не можу перевірити, але я б його встановив net.madrat.utils.sync.plist. Можливо, також буде корисно спочатку встановити unloadсвій дімон перед завантаженням, якщо ви редагували файл.


Дякую за інформацію. Однак: (1) Я вже прочитав усі документи, які ви зв'язали вище, та ще кілька. Ніде насправді не сказано, як запустити агент. (Принаймні, я його ніде не знайшов.) Це було б добре, якби мій інтуїтивний підхід працював. (2) Зміна імені файлу також не працює. :-( (3) частина інформації застаріла. Наприклад, вони пропонують команду launchd bashдля налагодження - але це не працює на Leopard ( launchdнеможливо запустити безпосередньо).
Konrad Rudolph

@Konrad Rudolph: Ласкаво просимо: :) @Skylarking отримує цікаві моменти: ви перевірили подачу файлу? Або використали команду sudo? Мені також доводилося іноді перезавантажуватися, щоб startctl працював належним чином.
Арко

3

Я не можу знайти документацію про те, що це насправді стандартна поведінка, але здається, що для запуску потрібні абсолютні шляхи до файлів плістів. Тому спробуйте /usr/bin/rsyncзамість цього. Для мене працює!


0

спробуйте це, мої сценарії працюють без використання програмної частини, просто програмні аргументи ...

замінити

    <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>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

0

спробуйте додати ці ключі до вашого списку файлів

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

0

У вашому .plist-файлі є одна неправильна річ і одна хитра річ (кожен із цих моментів зачіпався в попередніх відповідях; я збираю їх тут).

Вам краще написати:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

Перший аргумент у ProgramArgumentsмасиві - це програма, яку потрібно виконати. Якщо Programключ опущений, він за замовчуванням застосовується до першого аргументу ProgramArguments; певно, розумно вказати це лише один раз.

Оскільки ви пропустили цей перший аргумент, ваш .plist буде викликати rsync (через ім'я Program), але "першим аргументом" rsync був би /path/to/folder, а ні -ar(запущена програма була дуже коротко видно у psвихідних даних, перш ніж вона вийде з помилка, але названа як -ar, що є змістом нульового аргументу).

Вам не доведеться включати шлях до цього rsync, але в такому контексті, мабуть, доцільно це робити, щоб уникнути необхідності покладатися на те, PATHщо встановлено належним чином.

Документація на це знаходиться в launchd.plist(5). Зауважте, що ця сторінка підкреслює, що значення ProgramArgumentsключа передається execvp(3). Це сторінка, execvpяка пояснює пошук PATH.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.