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