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
- это 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 или запущен и смешайте , что со здоровым чтением 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