Как запустить сервис, используя Mac OSX launchctl

Почему мой файл конфигурации 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>

в ответ.

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

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, а затем перезагрузить его с помощью sudo)

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

<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 или launch и смешать это со здоровым чтением http://www.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

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

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

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

Другие вопросы по тегам