3

Почему мой файл конфигурации plist не загружается как сервис, использующий launchctl?

Я использую OSX Yosemite, и я прочитал этот прекрасный учебник по использованию launchctl http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/

Я создал правильный файл .plist с конфигурацией сервиса (я знаю, что это правильно, потому что это почти точная копия рабочего файла конфигурации plist, который я создал несколько лет назад). Я печатаю в

launchctl load ~/Library/LaunchAgents/com.apple.myservice.plist

и получить в ответ

~/Library/LaunchAgents/com.apple.myservice.plist: File exists

Это не очень описательно, но я иду и набираю

launchctl start com.apple.myservice

и нет выхода, и ничего не происходит. Я также пытался использовать

launchctl enable ~/Library/LaunchAgents/com.apple.myservice.plist

и я просто получаю

Usage: launchctl enable <service-target>

в ответ.

Может кто-нибудь, пожалуйста, ответьте с правильным синтаксисом для загрузки службы запуска на OSX Yosemite?

2 ответа2

4

Я столкнулся с подобными проблемами сегодня.

Просто выгрузите сервис и загрузите его снова, чтобы решить проблему с File exists .

Похоже, что каждый раз, когда вы обновляете файл plist, вам придется это делать.

2

launchd может легко попасть в "странные" состояния.

  • load означает прочитать конфигурационный файл и, возможно, запланировать запуск.
  • unload означает stop и отменить планирование конфигурационного файла
  • start запустит сервис (игнорируя расписание, я считаю)
  • stop остановит службу (опять же, игнорируя расписание)

Обычно, если вы хотите "перезапустить" его, вы выгружаете и перезагружаете конфигурацию следующим образом:

launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist

-w означает "запись", что означает, что изменение повлияет на перезагрузку (загрузит каждый логин или загрузку ... или не будет загружаться снова при входе в систему или загрузке).

Если это служба системного уровня (в /Library/LaunchDaemons или /Library/LaunchAgents вам может понадобиться сделать это с помощью sudo (и если вы сделали это без sudo по ошибке, вам может потребоваться выгрузить его без sudo, а затем перезагрузить его с помощью Судо)

Ключ в файле, который заставляет его start при load - это RunAtLoadKeepAlive поддерживает его работу, если по какой-то причине он умирает)

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

Иногда бывает сложно получить протокол отладки от самого launchctl, но ключи StandardErrorPath и StandardOutPath могут по крайней мере помочь вам узнать, умирает ли ваше приложение из-за отсутствующей или неверной информации (например, нерасширенной переменной среды или пути без записи). Просто убедитесь, что указанный вами путь доступен для записи пользователю, выполняющему процесс.

<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>

Потому что они так трудно отлаживать, я бы рекомендовал использовать LaunchControl или запущен и смешайте , что со здоровым чтением launchd.info.

Кроме того, здесь есть несколько советов по отладке:https://serverfault.com/questions/183589/how-do-i-activate-launchd-logging-on-os-x

Я еще не пробовал, но это решение выглядит самым простым:

sudo launchctl log level debug 
tail -f /var/log/system.log

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .