Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 管理守护进程的软件更新--确保它们未运行_Macos_Launchd - Fatal编程技术网

Macos 管理守护进程的软件更新--确保它们未运行

Macos 管理守护进程的软件更新--确保它们未运行,macos,launchd,Macos,Launchd,关于在OS X上进行软件更新的正确方法,我有一个一般性问题。我的应用程序运行两个守护进程,都是root用户。其中一个守护进程可以从网络下载软件更新包。下载时,它必须安装新的二进制文件,包括两个二进制文件替换守护进程的当前二进制文件。由于这两个守护进程当前都在运行,因此替换它们可能是一个问题。因此,我几乎没有什么想法,但如果能得到专家的建议,那会很有帮助 方法1:下载更新后,可以将其保存在某个位置。更新守护进程可以将bash脚本放置在另一个指定位置,并创建plist,该plist可以放置在Laun

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

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

方法2:下载后,立即以编程方式使用launchd启动脚本。这应该是可能的,对吧?脚本等待一个如图所示的术语信号来实际替换二进制文件并优雅地退出。同样的问题是,当我的脚本启动时,我必须确保在替换二进制文件之前关闭我的守护进程。我不知道该怎么做


有人能建议哪种方法更好,并告诉我更好的方法吗

我用来更新守护进程的解决方案是启动单独的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

osascript如果有.app应用程序正在运行该怎么办。如何更新?这不会是launcd发起的吗?我们是不是突然杀了它?对我来说似乎不是很好。另外,如果用户在更新守护进程启动时实际使用应用程序并执行此操作,该怎么办?我已经更新了我的帖子以退出应用程序。您可以向用户显示一些通知,该更新将立即执行。谢谢cody!如果应用程序因某种原因拒绝关闭,会发生什么。我们看到的应用程序只是挂起而不是关闭?这个剧本会一直等下去吗?我试过了,效果很好,但后来我的应用程序挂不住了。我试图从我的应用程序中调用脚本,该应用程序没有管理员权限,只能查看发生了什么。我使用这里编写的方法从程序运行脚本,而不需要fork和exec。我得到了提示,但由于errorscoreservicesd[26]:应用程序应用程序:“Simple Downloader”[0x0/0x1214213]@0x0x7f9304b7c000试图向前推进,但不在fPermittedFrontASNs((ASN:0x0-0x1216215:)中,因此拒绝。几秒钟后,由于Simple Downloader[24038]:脚本执行失败!错误-128:132:执行错误:简单下载程序出错:AppleeEvent超时。(-1712)这是苹果脚本超时吗?