我有一个关于在OS X上进行软件更新的正确方法的一般性问题。我的应用程序以root身份运行两个守护进程。其中一个守护进程可以从网络下载软件更新包。下载时,必须安装新的二进制文件,包括两个二进制文件替换守护进程的当前二进制文件。由于两个守护进程当前都在运行,因此替换它们可能是一个问题。因此,我没有什么想法,但是对于获得专家建议会有所帮助。
方法1:下载更新后,可以将其保存在某个位置。更新守护程序可以将bash脚本放在另一个指定位置并创建一个plist,该plist可以放在LaunchDaemons目录中,以便在下次重新引导时触发。该脚本在启动之前简单地替换了两个二进制文件。只有当我们能够确保在脚本执行之前两个守护进程没有启动时,才可能这样做。在启动守护进程之前,我没有找到一个告诉launchd首先运行我的脚本的好方法。所以我不太确定这是不是一个好的解决方案。
方法2:下载后,立即以编程方式使用launchd启动脚本。这应该是可能的,对吗?脚本等待这里显示的TERM信号https://discussions.apple.com/thread/3636062?start=0&tstart=0来实际替换二进制文件并优雅地退出。问题是,当我的脚本启动时,我必须确保在更换二进制文件之前关闭了我的守护进程。我不知道该怎么做。
任何人都可以建议哪种方法更好,还让我知道更好的方法吗?
答案 0 :(得分:1)
我用来更新守护进程的解决方案是启动单独的shell脚本,然后执行下一步:
launchctl unload -w path.to.plist
卸载守护程序,它将等待作业完成。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