Как запустить службу с помощью launchctl Mac OSX

13468
almel

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

3
Возможно `load -w` поможет. * «Я знаю, что это правильно, потому что это почти точная копия рабочего конфигурационного файла plist, который я создал несколько лет назад» * - значит, вы изменили значение для «Label», я надеюсь? Вы уверены, что это не какой-то сервис по запросу? Вам нужно будет показать нам файл `plist`. Кроме того, `launchctl enable` не ожидает путь; видеть такие вещи, как `пользователь // [имя-службы] `в` man launchctl`, или посмотрите [В чем разница между `имя-службы` и` цель-службы`?] (http://apple.stackexchange.com/questions/166397 / что-это-разностной-между-а-сервис-имя-а-сервис-мишень). Arjan 8 лет назад 3
Также убедитесь, что файл `.plist` НЕ доступен для записи группой и миром. И, кроме того, если это не какой-то сервис, предоставляемый Apple, то использование `com.apple` в будущем может привести к путанице… Arjan 8 лет назад 2
... и, наконец: вы уверены, что File существует не какой-то вывод процесса, который вы пытаетесь запустить? Что говорит Консоль? В конце: нам просто нужно посмотреть этот файл `plist`. Arjan 8 лет назад 0
@Arjan, я забыл изменить метку в файле .plist по сравнению с предыдущей верной версией, которую я использовал, что объясняет вывод «Файл существует». Теперь, когда он изменен на правильную метку, он работает как положено. Если вы хотите ответить на мой оригинальный вопрос, я приму его как правильный. almel 8 лет назад 0

2 ответа на вопрос

4
daisy

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

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

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

1
CoolAJ86

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это 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