1

Я разработал пакет приложений MyApp, в котором есть демон-процесс my-daemon-process 'и файл plist, зарегистрированный соответствующим образом в'/Library/LaunhDaemons/com.my-app.plist '.

Теперь у меня есть более новая версия комплекта приложений, которая также обновляет «my-daemon-process». Я пытаюсь обновить его, пока «my-daemon-process» из установленной версии уже запущен. После обновления происходит циклический сбой.

Если я вручную выгружаю и загружаю сервис, используя 'launchctl unload/load', он работает нормально.

Примечание. Обе версии «my-daemon-process» ссылаются на разные версии одной и той же сторонней общей библиотеки.

Что я здесь не так делаю? Любое понимание того, что MacOS делает внутри при обновлении приложения, также будет полезно.

1 ответ1

0

Хорошо, так что я понял это в конце концов.

MacOS выполняет обновление запущенного пакета: он заменяет все файлы и сценарии, но НЕ выгружает ранее загруженный файл plist. Новый процесс / демон запускается под уже загруженной / кэшированной копией plist, которая была (сейчас) из предыдущей сборки.

Выпуск здесь был плист от старой и новой версии отличаются. Ранее я использовал DYLD_LIBRARY_PATH и НЕ упаковывал libsqlite3 в /Applications /MyApp /Contents /Library. В более новой версии это было изменено, чтобы удалить DYLD_LIBRARY_PATH (переключено на использование @rpath) и включить libsqlite3, который является урезанной версией.

MacOS внутренне поддерживает некоторые метаданные, используя libsqlite, при запуске любого процесса в приложении. Из-за влияния предыдущего plist и DYLD_LIBRARY_PATH, он смотрел на мою поставленную библиотеку libsqlite, а не на полную версию в "/System/Library/Frameworks/..." и, следовательно, на сбой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .