我正在为OS X上的守护进程实现自我更新程序。更新是作为.pkg文件发布的,所以我要做的是如下:
当通知守护程序有更新可用时,它会通过system()调用调用installer来安装程序包。该软件包包含一个较新版本的守护程序,一个用于停止守护程序(launchctl unload /Library/LaunchDaemons/foo.plist
)的预升级脚本,以及一个在安装新版本后重新启动它的postflight脚本。我遇到的问题是安装程序进程过早退出。它怀疑这可能是因为安装程序杀死其父进程以便更新它,然后自己被杀死而不是继续作为它自己的孤儿进程。我试过以下没有运气:
当我从命令行运行install命令时,install命令一致地完成而没有错误,并且从安装程序运行时一致地失败。当从安装程序调用时,我将输出传递给文件,有时它什么也没有,有时它会显示安装在输出停止之前达到约41%完成。关于我如何能够弄清楚过程中发生了什么或确保它没有它的父母而保持活着的任何想法?
答案 0 :(得分:1)
当您致电launchctl unload
时,它会终止整个流程组(与简单的kill
不同)。您希望将子流程移动到单独的流程组中。最简单的方法是使用C调用setsid()
。
如果您正处于shell脚本的中间,则应该查看以下方法。我没有尝试过这些,因为我正在处理一个C程序,可以setsid()
:
set -m
。这应该打开监控模式,该模式显示“后台进程在一个单独的进程组中运行,并且在完成后打印包含其退出状态的行。”