3

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

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

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

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

4

1 回答 1

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
于 2013-04-10T07:13:35.810 回答