3

我正在为 OS X 上的守护进程实现自我更新程序。更新以 .pkg 文件的形式发布,所以我要做的事情如下:当通知守护进程有可用更新时,它通过 system() 调用调用安装程序来安装软件包。该软件包包含一个较新版本的守护程序、一个停止守护程序的升级前脚本 ( launchctl unload /Library/LaunchDaemons/foo.plist) 和一个在安装新版本后启动它的 postflight 脚本。我遇到的问题是安装程序过早退出。我怀疑这可能是因为安装程序为了更新它而杀死了它的父进程,然后自己被杀死而不是继续作为它自己的孤立进程。我试过以下没有运气:

  • 使用“&”后挂安装程序命令以在后台运行它
  • 使用nohup包装安装程序命令

当我从命令行运行安装命令时,安装命令始终如一地完成,而从安装程序运行时始终失败。当从安装程序调用时,我将输出通过管道传输到一个文件,有时它什么都没有,有时它显示安装在输出停止之前完成了大约 41%。关于如何弄清楚进程发生了什么或确保它在没有父进程的情况下保持活力的任何想法?

4

1 回答 1

2

当您调用 时launchctl unload,它会杀死整个进程组(与简单的 不同kill)。您希望将子流程移动到单独的流程组中。最简单的方法是使用 C 调用setsid()

如果您正在使用 shell 脚本,则应该查看以下方法。自从我处理 C 程序以来,我还没有尝试过这些,并且可以setsid()

  • 在调用安装程序之前,请使用set -m. 这应该打开监控模式,它表示“后台进程在单独的进程组中运行,并且在完成后打印包含其退出状态的行。”
  • 试试这个子交互式 shell 技巧:shell 脚本中的新进程组
于 2012-08-07T04:02:25.260 回答