2013-04-10 74 views
1

我有一个关于在OS X上执行软件更新的正确方法的常见问题。我的应用程序以root身份运行两个守护进程。其中一个守护进程可以从网络下载软件更新包。下载时,它必须安装新的二进制文件,其中包括两个二进制文件,用于替换守护进程的当前文件。由于这两个守护进程正在运行,因此替换它们可能是一个问题。因此,我没有什么想法,但是就同样的问题得到专家意见会有所帮助。方法1:下载更新后,它可以保存在某个位置。更新后台程序可以将bash脚本放置在另一个指定位置,并创建一个plist,放置在LaunchDaemons目录中,以便在下次重新引导时触发。脚本在启动之前简单地替换这两个二进制文件。这只有在我们可以确保两个守护进程在我的脚本执行之前不启动的情况下才有可能。在启动守护进程之前,我没有找到一个好方法来告诉launchd先运行我的脚本。所以我不太确定这是否是一个好的解决方案。方法2:下载后,立即使用launchd以编程方式启动脚本。这应该是可能的,对吧?脚本等待TERM信号,如https://discussions.apple.com/thread/3636062?start=0&tstart=0所示,以实际替换二进制文件并正常退出。问题再次出现,当我的脚本启动时,我必须确定在更换二进制文件之前我的守护进程已关闭。我不知道如何做到这一点。管理守护进程的软件更新 - 确保它们没有运行

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

回答

1

我用它来更新后台程序的解决方案是推出独立的shell脚本,做了下:通过launchctl unload -w path.to.plist

  • 卸载守护程序,它会等待作业完成。
  • 删除旧文件
  • 安装新的文件(这里我实际安装包,这将启动我的守护在飞行后的脚本)
  • 可选:启动守护进程与launchctl load -w path.to.plist

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

您可以使用AppleScript的在你的shell脚本优雅地退出应用程序:

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 
+0

如果有一个正在运行的.app应用程序,该怎么办?如何更新?这不会由启动发起?我们是否突然杀了它?对我来说似乎不是很好。另外,如果用户在更新守护进程启动时实际使用应用程序并执行此操作? – user2085689 2013-04-10 07:38:42

+0

我已更新我的帖子以退出应用程序。并且您可以向用户显示一些通知,该更新将立即执行。 – cody 2013-04-10 07:43:41

+0

感谢科迪!如果应用程序出于某种原因拒绝关闭,会发生什么情况。我们确实看到只挂起而不关闭的应用程序?这个脚本会继续等下去吗?我试了一下,它运作良好,但我的应用程序没有挂。我试图从我没有管理权限的应用程序调用脚本来查看发生的事情。我用这里写的方法http://stackoverflow.com/questions/6841937/authorizationexecutewithprivileges-is-deprecated从程序运行脚本,而不需要fork和exec。我得到了提示符,但失败,错误 – user2085689 2013-04-11 00:37:22