【问题标题】:C++ Keep process alive after it kills its parentC ++在杀死其父进程后保持进程存活
【发布时间】:2012-08-04 01:12:52
【问题描述】:

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

  • 使用 '&' 将安装程序命令后置以在 背景
  • nohup包装安装程序命令

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

【问题讨论】:

  • 是否应该像那样卸载和加载守护进程?似乎您可以替换守护进程的可执行文件,然后让守护进程自行终止,以便 launchd 重新启动它,但会获得新版本。

标签: c++ macos process installation daemon


【解决方案1】:

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

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

  • 在调用安装程序之前,请使用set -m。这应该打开监控模式,即“后台进程在单独的进程组中运行,并在完成后打印包含其退出状态的行。”
  • 试试这个子交互式shell技巧:New process group in shell script

【讨论】:

  • 啊,我没有意识到 launchd 杀死了整个进程组。这是解决我的问题的关键。我最终做的是在 plist 文件中添加以下密钥:AbandonProcessGroup <boolean> When a job dies, launchd kills any remaining processes with the same process group ID as the job. Set- ting this key to true disables that behavior. [developer.apple.com/library/mac/#documentation/Darwin/Reference/…
  • 谢谢;这也是有用的信息。就我而言,我几乎总是想杀死整个 pgrp,但很高兴知道如何将其关闭。
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多