管理守护程序的软件更新 - 确保它们不运行

时间:2013-04-10 03:03:28

标签: macos launchd

我有一个关于在OS X上进行软件更新的正确方法的一般性问题。我的应用程序以root身份运行两个守护进程。其中一个守护进程可以从网络下载软件更新包。下载时,必须安装新的二进制文件,包括两个二进制文件替换守护进程的当前二进制文件。由于两个守护进程当前都在运行,因此替换它们可能是一个问题。因此,我没有什么想法,但是对于获得专家建议会有所帮助。

方法1:下载更新后,可以将其保存在某个位置。更新守护程序可以将bash脚本放在另一个指定位置并创建一个plist,该plist可以放在LaunchDaemons目录中,以便在下次重新引导时触发。该脚本在启动之前简单地替换了两个二进制文件。只有当我们能够确保在脚本执行之前两个守护进程没有启动时,才可能这样做。在启动守护进程之前,我没有找到一个告诉launchd首先运行我的脚本的好方法。所以我不太确定这是不是一个好的解决方案。

方法2:下载后,立即以编程方式使用launchd启动脚本。这应该是可能的,对吗?脚本等待这里显示的TERM信号https://discussions.apple.com/thread/3636062?start=0&tstart=0来实际替换二进制文件并优雅地退出。问题是,当我的脚本启动时,我必须确保在更换二进制文件之前关闭了我的守护进程。我不知道该怎么做。

任何人都可以建议哪种方法更好,还让我知道更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我用来更新守护进程的解决方案是启动单独的shell脚本,然后执行下一步:

  • 通过launchctl unload -w path.to.plist卸载守护程序,它将等待作业完成。
  • 删除旧文件
  • 安装新文件(这里我实际安装了包,它将在postflight脚本中启动我的守护进程)
  • 可选:使用launchctl load -w path.to.plist
  • 启动守护程序

要执行脚本,只需要fork(),setsid()和execv()

您可以在shell脚本中使用applescript来优雅地退出应用程序:

osascript << EOF
if application "Your Application" is running then
    -- Force application to quit
    tell application "Your Application" to quit
    -- Wait until it quits
    repeat
        if application "Your Application" is not running then exit repeat
        delay 1
    end repeat
end if
EOF
killall -15 your_app # just in case