【问题标题】:Default Shutdown Order of Windows ServicesWindows 服务的默认关闭顺序
【发布时间】:2016-03-23 17:38:09
【问题描述】:

虽然我可以找到有关 Windows 服务如何以基于服务组和基于标签的服务组内启动顺序的文章,但我无法获得有关 Windows 服务默认关闭顺序的信息。

如果我们不指定“PreshutdownOrder”来更改关闭顺序,我们是否可以假设 Windows 服务的关闭顺序与其启动顺序相反?如果不是,那么为什么会这样?关闭命令是如何确定的?如果是,那么您能否向我指出最好来自 Microsoft 的相关文档?

我问这个问题是因为我的机器上有一个属于服务组的应用程序白名单服务(比如 A)和一些不属于任何服务组的服务(比如 B 和 C)。出于系统安全原因,我想确保白名单服务 A 在其他服务启动之前启动,并在其他服务关闭后关闭。

【问题讨论】:

    标签: windows service


    【解决方案1】:

    来自 MSDN 上的Service Control Handler Function:

    在预关闭通知完成后,所有使用 SERVICE_ACCEPT_SHUTDOWN 控制代码调用 SetServiceStatus 的控制处理程序都会收到 SERVICE_CONTROL_SHUTDOWN 控制代码。按照它们在已安装服务数据库中出现的顺序通知它们。

    我相信这样做的结果是通知服务的顺序是不可预测的。当然,服务不必按照通知的顺序停止;系统不会等到每个服务都停止后才通知下一个服务。

    根据您的描述,在您的情况下,最好的选择可能是让服务 A 在系统关闭期间继续运行。任何未注册关闭通知的服务都只会继续运行,直到系统实际关闭或重新启动。

    但是,如果必须通知服务 A 系统正在关闭(例如,它可能需要彻底关闭数据库文件),那么它可以在等待所有相关服务停止时返回 STOP_PENDING .

    【讨论】:

    • 感谢哈利的回复。实际上,服务 A 是第三方商业软件,我无法控制或访问其源代码。然而,服务 B、C 等已在内部开发。让我调查一下“PreshutdownOrder”设置,看看是否有帮助。
    • 文档对 PreshutdownOrder 的影响不是很清楚。您可能需要进行实验。但是根据文档,系统确实会等待注册预关闭通知的服务退出,然后再启动未注册的服务。因此,如果 A 没有设置 ACCEPTS_PRESHUTDOWN(您可以在命令行上使用 sc query 检查),您只需在其他服务上设置 ACCEPTS_PRESHUTDOWN。
    • 再次感谢哈利。通过您的sc query 建议,我能够发现服务 A 接受关闭,并且由于其他服务是内部开发的,我们也可以让它们接受关闭。因此我相信我应该能够通过“PreshutdownOrder”注册表设置来控制关机顺序。
    • 我认为您需要让您的服务接受关闭前通知而不是关闭通知。但是您可以进行实验。
    • 分享我的最新观察。虽然服务 A 接受关闭通知,但它不接受关闭前通知。我修改了服务 B 以接受关闭前通知,并且能够延迟服务 B 的关闭。无论“PreshutdownOrder”注册表设置中的服务 A 和 B 的顺序如何,基于我有限的测试服务 B 总是在服务 A 之前关闭. 即使服务 A 和 B 从“PreshutdownOrder”注册表设置中删除,服务 B 在服务 A 之前关闭。
    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2010-09-25
    相关资源
    最近更新 更多