.NET 服务的“已达到超时”错误未触发服务恢复?

.NET 服务的“已达到超时”错误未触发服务恢复?

我编写的 C# 服务有时不会在启动的虚拟机上自动启动 - 我们在事件日志中看到“等待服务连接时超时”条目。

根本问题与这个类似的问题——但这里的区别是,我在服务上设置了“恢复”选项,以便在所有故障时重新启动服务。但是,此恢复过程不会被触发——当发生这种情况时,在启动完成后仍必须手动启动服务。

恢复选项是否仅在硬服务崩溃时触发,而不是在启动超时时触发?

我使用 log4net,当发生这种情况时,看不到任何日志条目,因此我不确定我编写的任何代码是否在超时之前被执行(因此解决方案是使用 服务基础.请求额外时间或者WINAPI 的 SetServiceStatus不会产生任何效果)。

假设这是 .NET 框架或类似框架的一些潜在问题,导致启动速度非常慢(即由于许多虚拟机同时启动而导致的物理系统资源或 I/O 争用),我是否需要编写一个轻量级的 C++ 看门狗类型的服务来检测此问题并在事后尝试重新启动该服务?


更多详细信息:此服务位于一台重新启动两次以安装 Windows 更新的 VM 上。第一次重新启动后,服务启动正常 - 根据日志语句,服务构造函数运行和 OnStart 处理程序开始之间约有 1 秒,服务在 2 秒内完成启动。第二次重新启动时,根本没有日志条目,只有事件日志“已达到超时”错误,经检查,服务未运行。一个独立但类似的 .NET 服务在两次重新启动后成功启动,但第二次启动时间更长 - 同样根据日志语句,第一次重新启动后约有 0.7 秒,第二次重新启动后约有 6 秒。

最初在 StackOverflow 上提问,建议我在这里问)

答案1

在这里遇到了同样的问题,看来你是对的,恢复选项不会在启动超时时触发,只有当服务实际崩溃时才会触发(虽然找不到任何关于此的官方文档,但根据其他报告,这似乎是一个普遍问题)。

解决此问题的建议方法如下:

  1. (最推荐)将服务的“启动类型”设置为“自动(延迟启动)” - 这可以帮助避免超时,因为系统会等待其他关键系统服务启动后再启动该服务。

  2. 让有问题的服务在启动之前“依赖”另一项服务(例如,如果由于 SQL 服务器不可用而导致服务挂起)https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/sc-config- 例如

    sc config [第一个服务名称] depend=[第二个服务名称]

  3. 创建一个计划任务,如果服务失败则尝试重新启动服务。

  4. (最不推荐)更改 Windows 服务管理器的 ServicesPipeTimeout 设置,以强制 Windows 在启动缓慢的服务时等待更长时间 - 需要在使用该服务的每台计算机上进行更新https://docs.microsoft.com/en-GB/troubleshoot/windows-server/system-management-components/service-not-start-events-7000-7011-time-out-error

希望这会有所帮助,这是一个令人讨厌的问题,但可以解决。

相关内容