我已经开发了一个应用程序包 MyApp,它具有守护进程 my-daemon-process' 和在 '/Library/LaunhDaemons/com.my-app.plist' 下适当注册的 plist 文件。
现在,我有了更新版本的应用程序包,它也会升级“my-daemon-process”。我尝试在已安装版本的“my-daemon-process”已运行时对其进行升级。升级后,它陷入了循环崩溃。
如果我使用“launchctl unload/load”手动卸载和加载服务,它可以正常工作。
注意:'my-daemon-process' 的两个版本指的是同一第三方共享库的不同版本。
我在这里做错了什么?对应用程序升级时 MacOS 内部执行的操作的任何见解也将有所帮助。
答案1
好的,我最终明白了这一点。
MacOS 处理正在运行的软件包升级的方式是:它替换所有文件和脚本,但不会卸载先前加载的 plist 文件。新进程/守护进程在已加载/缓存的 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/...”下的完整版本,因此崩溃。