Как активировать логирование launchd на OS X?

Вопрос или проблема

Как включить логирование launchd на OS X 10.6?

Я добавил новый демон, который не запускается должным образом (статус 1).

Я хочу разобраться с проблемой, но не смог найти логи launchd, их нет в /var/log/launchd.log.

Предполагая, что вы хотите записывать ваш процесс, а не сам launchd, если вы добавите следующие строки в файл plist launchd:

<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>StandardErrorPath</key>
<string>/path/to/another_logfile.log</string>

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

См.: Раздел отладки заданий launchd в создании демонов и агентов запуска.

Я нашел решение

 sudo launchctl log level debug 

и после этого

 tail -f /var/log/system.log

На OS X 10.11 (El Capitan) вы можете использовать sudo launchctl debug <service-target> --stdout --stderr, чтобы включить однократное логирование, если не хотите использовать вариант с файловой системой, предложенный @peter.

Многое в текущей реализации launchctl изменилось, и <service-target> довольно странен. Например, предположим, у меня есть локальная служба, которую я настраиваю в ~/Library/LaunchAgents/dev.localmon.plist с “label” dev.localmon. Ее <service-target> — это gui/$UID/dev.localmon, где $UID — это ваш идентификатор пользователя, который, поскольку вы запускаете это в CLI, ваша оболочка подставит за вас.

Так что, если моя служба dev.localmon падала при запуске (это так), я мог бы вызвать следующее, чтобы launchctl перенаправил stdout и stderr процесса в мою оболочку в следующий раз (и только в следующий раз), когда служба запустится:

sudo launchctl debug gui/$UID/dev.localmon --stdout --stderr

Поскольку это блокирует открытые и готовые TTY, перейдите в другой терминал и выполните:

launchctl start dev.localmon
# start - это устаревшая команда и не использует новую нотацию service-target

Тогда вернитесь в первый терминал, и вы должны увидеть вывод. (Странно, он не закрывается, когда процесс службы завершается, поэтому вам придется нажать Ctrl-C.)

Кстати, как только вы исправите свой конфигурационный файл с тем, что было неправильным в PATH или окружении, которое ломало службу ранее, вам все равно нужно будет использовать старую команду launchctl unload ~/Library/LaunchAgents/dev.localmon.plist && launchctl load ~/Library/LaunchAgents/dev.localmon.plist, поскольку предположительная подсказка uncache в документации имеет следующий эффект:

Команда еще не реализована.

Ура стратегии разработки Apple после Джобса: “Двигаться быстро и ломать вещи”

На Sequoia (macOS 15.1) логи launchd теперь доступны в приложении Console -> Log Reports -> launchd.log

Console.app и launchd.log

Ответ или решение

Чтобы активировать журналирование launchd на OS X 10.6, вам необходимо следовать нескольким шагам. Прежде всего, убедитесь, что вы понимаете структуру daemon’ов в системах macOS и разницу между журналами самомого launchd и журналами, создаваемыми вашим процессом. Давайте рассмотрим этот процесс более детально.

Шаг 1: Настройка plist файла

Вам нужно отредактировать файл списка plist, который настраивает ваш демон. Введите следующие строки в соответствующий раздел plist файла:

<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>StandardErrorPath</key>
<string>/path/to/another_logfile.log</string>

Замените /path/to/logfile.log и /path/to/another_logfile.log на пути к файлам, куда вы хотите записывать журналы stdout и stderr соответственно. Это позволит вашему процессу записывать вывод и ошибки в указанные файлы, где вы сможете осуществить их отслеживание и анализ.

Шаг 2: Перезагрузка демона

После внесения изменений в файл plist необходимо перегрузить демон, что можно сделать следующей командой в терминале:

sudo launchctl unload /path/to/your.plist && sudo launchctl load /path/to/your.plist

Эта команда сначала снимает демон с загрузки, а затем устанавливает его снова. Это позволит применить ваши изменения.

Шаг 3: Включение журналирования для launchd

Так как вы пытаетесь выяснить, почему демон не запускается (статус 1), необходимо также включить журналирование самого launchd. Для этого выполните команду:

sudo launchctl log level debug

Шаг 4: Просмотр журналов в реальном времени

Чтобы следить за системными журналами в режиме реального времени, используйте команду:

tail -f /var/log/system.log

Таким образом, вы сможете видеть сообщения от вашего демона и сообщения об ошибках, которые могут помочь в отладке.

Дополнительные шаги при использовании более новых версий macOS

Если вы работаете на более современных версиях ОС X, таких как OS X 10.11 (El Capitan) и выше, вы можете задействовать дополнительные команды для более гибкого мониторинга:

sudo launchctl debug gui/$UID/dev.localmon --stdout --stderr

Здесь заместо dev.localmon используйте имя вашего сервиса. Это позволит отправить вывод ваших процессов в терминал, где вы сможете видеть, что происходит при запуске демона.

Новые улучшения в macOS 15.1 и далее

Для более новых версий, начиная с macOS 15.1, логи launchd доступны через приложение Console. Вы можете открыть приложение, перейти в раздел Log Reports и выбрать launchd.log. Это будет удобным средством для просмотра всех записей, связанных с запуском вам доступных служебных задач.

Заключение

Активация журналирования для launchd в macOS позволяет эффективно отлаживать демоны и решать проблемы, возникающие при их запуске. Следуя приведённым выше шагам, вы сможете настроить правильное журналирование и быстро выявить причины, по которым ваш демон не запускается. Не забывайте регулярно проверять доступные логи и обновления системы для обеспечения стабильности работы ваших сервисов.

Оцените материал
Добавить комментарий

Капча загружается...