【问题标题】:Auto-update a Windows Service [closed]自动更新 Windows 服务 [关闭]
【发布时间】:2010-11-08 17:50:36
【问题描述】:

我即将开发一个程序,该程序将作为 Windows 服务安装并在多个客户端的后端服务器(可访问互联网)上运行。我没有对服务器的物理访问权限。我正在研究的是一个可靠地推出程序更新的计划。

我花了很多时间寻找 Windows 服务自动更新的最佳实践,但几乎没有找到有用的信息。大多数技术(例如 ClickOnce)似乎主要适用于基于 Windows 窗体的应用程序。

我目前的计划是:

  • 当更新可用时,让正在运行的服务下载、安装并启动更新服务。
  • 更新服务将下载主服务的新版本并将其与当前仍处于活动状态的版本并排安装。
  • 更新服务接下来会停止旧版本,然后启动新版本的服务。
  • 新版本启动时禁用更新服务。

对我来说一些重要的问题是:

  • 能够同时处理主服务和更新服务的更新
  • 能够在更新过程中的任何时候处理中断,例如电源故障或连接故障

我想知道这是否是解决此问题的常用方法和/或我是否遗漏了任何重要的东西。是不是太复杂了,还是太简单了?你是怎么做到的(或者,更好的是,你是如何成功地做到这一点的)?

谢谢!

【问题讨论】:

    标签: windows-services auto-update


    【解决方案1】:

    去年我也遇到过同样的问题,我也遇到过很多同样的问题。几点建议:

    • 由于任一服务都可能更新, 这两项服务都将作为 另一个的更新者。服务 A 将 更新服务 B,反之亦然。为了 这个原因,我建议简单地运行 随时提供这两项服务。除非 你担心真的加载 关闭你的服务器 是否更新存在调用, 启用/禁用服务管理 不值得开销。

    • 无法将类似服务安装在 单机。换句话说,你 无法安装新旧版本 如果他们有服务并排 同名。除非你要 使您的更新过程复杂化,我 建议你卸载旧版本 然后安装新版本。 例如,服务 A 将下载 服务 B 安装程序,卸载 服务B,安装新版本 服务 B 然后运行。服务乙 服务 A 也会这样做。

    • 由于每个服务都在管理 其他,他们不应该只检查 可用的更新,但他们应该 确认彼此的健康。为了 例如,服务 A 会检查以查看 如果服务 B 存在并且它是 跑步。如果健康检查失败, 解决问题的步骤列表 并让服务运行将是 由服务 A 完成。执行 健康检查和恢复操作 无论什么问题,现在都会涵盖您 随着更新出现,初始 安装或一般操作。

    • 在两个客户端上进行充足的日志记录 和服务器。你会想要追踪 采取了哪些行动以及何时采取的行动。 例如,服务 A 可能在 正在检查更新,当它是 执行健康检查和 相关的动作。在服务上 (假设您正在调用网络 服务寻找更新)跟踪 每个服务发出的调用。如果 您的服务没有更新 至少你会有一条线索 面包屑(或缺少面包屑) 指出问题所在。

    这类解决方案确实存在大量潜在问题:服务在启动时无法运行,UAC 阻碍,无法使用同一用户安装和卸载服务,确保安装服务的用户有足够的权限、连接丢失、在客户端计算机上安装 .NET Framework、在安装后处理重启(如有必要)等。

    祝你好运。解决这个问题很有趣,但也有挫败感——尤其是因为,正如你所说,没有很多可用的记录信息。

    【讨论】:

    • 感谢您的宝贵意见。您是如何处理在卸载旧版本之后安装新版本之前中断更新过程的潜在情况的?您是否记录了您在此过程中的进度?
    • 我不进行增量安装。该服务要么已安装并正在运行,要么没有。因此,我不跟踪我在这个过程中走了多远。我只是使用运行状况检查来确定是否有问题,并在必要时重新尝试安装。
    • @Ben 你有没有在什么地方发表过你的经历?
    • 感谢您的回复。为什么我们不能停止服务。覆盖安装过的文件并启动服务。我们将覆盖除配置文件之外的所有文件。我猜我们不需要卸载并重新安装它???
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多