控制 Windows 服务的启动顺序

Posted

技术标签:

【中文标题】控制 Windows 服务的启动顺序【英文标题】:Controlling start up sequence of a windows service 【发布时间】:2010-10-01 07:13:15 【问题描述】:

我使用 installutil 安装了 Windows 服务并设置为“自动启动”。我的问题是,当某些服务器重新启动时,它会尝试在“Microsoft SQL 服务”启动之前启动——我可以通过在系统重新启动期间查看事件日志来看到这一点。 Sql server 服务启动后让我的服务“自动启动”的最佳方法是什么?

我正在玩弄创建一个 SQL 作业集的想法,该作业集在“SQL 服务器代理”启动时启动,然后启动 Windows 服务。但希望有一种简单有效的方法来控制自动服务的启动顺序。

【问题讨论】:

【参考方案1】:

每个 Windows 服务都有一个它所依赖的其他服务的列表。这意味着它会等到它的依赖项启动后才会尝试启动,如果在您启动时它们没有自动启动,它会为您启动它们。

如果您在 .NET 中创建 Windows 服务,这里有一篇博文可能会有所帮助:

How to: Code Service Dependencies

否则这里有一个 Microsoft kb 条目,详细说明了通过注册表添加服务依赖项的方法:

How to delay loading of specific services

【讨论】:

谢谢。那效果很好。我添加了安装程序类 - 转到属性并添加了对“MSSQLSERVER”服务的依赖项。似乎工作。想知道 SQL Server 2005、2008 的服务名称是否保持不变.. 如果用户想在一个集中的故障转移集群上运行 SQL Server 会发生什么? @matthamilton 顶部链接已损坏 @DuncanGroenewald 网络的危险。遗憾的是,当它们只是博客文章时,不能保证 URL 是永久的。 :( 已修复。【参考方案2】:

您可以设置服务之间的依赖关系。

See here:

【讨论】:

【参考方案3】:

如果您想使用批处理脚本执行此操作,那么以下内容会有所帮助

REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\%ServiceKey%" /v "DependOnService" /t REG_MULTI_SZ /d "Service Number 01\0Service Number 02"

这使用 reg.exe see here

【讨论】:

【参考方案4】:

依赖关系很诱人,但在 SQL Server 的情况下,可能对系统的长期设计有害。考虑一下您的应用程序是否成功,而您的客户是否希望移动到另一个机器上的单独 SQL 服务器或故障转移集群。

更好的设计可能是在你的服务启动时加入一些重试/超时逻辑,这样它就会尝试联系 SQL Server(甚至可能在另一台机器上),等待,尝试,然后优雅地失败。

【讨论】:

以上是关于控制 Windows 服务的启动顺序的主要内容,如果未能解决你的问题,请参考以下文章

docker compose 服务启动顺序控制

weblogic调整多个服务启动顺序方法

控制Docker Compose的启动顺序的一个思路

如何修改windows系驱动加载顺序?

[BAT] BAT 顺序执行其他BAT 批处理文件可设置时间间隔(实际场景Windows下依次启动多个Tomcat服务)

iOS APP启动时所有方法的调用顺序分析