Как запустить сервис, используя 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, вам придется это делать.