我有一个自定义编写的 Windows 服务,在许多 Hyper-V VM 上运行。作为某些正在运行的自动化测试的一部分,虚拟机每小时重新启动几次。该服务设置为自动启动,几乎所有时间都可以正常启动。
但是,也许有 5% 的时间,由于我无法辨别任何模式,服务无法启动。当失败时,我在事件查看器中收到错误消息
等待“我的服务名称”服务连接时超时(30000 毫秒)。
出现这种情况,我可以手动启动服务,或者重新启动,服务就会正常启动。
我不明白的是,30 秒超时似乎没有出现在我的代码中。我的服务类的 OnStart() 方法的第一行将“Starting...”记录到其 log4net 日志中。当服务无法启动时,我什至根本没有记录任何内容,这表明 log4net 出于某种原因无法记录,或者在调用我的 OnStart() 之前发生超时。
该服务可以在各种操作系统上运行,从 XP 一直到 Win7 和 2008R2,我知道将服务设置为延迟启动可能会解决 Vista 及更高版本的问题,但这似乎是一种 hack。
我无法远程调试此问题,因为它是在系统启动期间间歇性发生的,而且我不知道进一步的方法来尝试弄清楚发生了什么。有什么想法吗?
我的猜测(仅此而已)是磁盘在启动过程中剧烈抖动,以至于 .NET Framework 本身在 Windows 分配给服务启动的 30 秒内无法启动。
一个笨拙的解决方法可能是将服务设置为手动启动,然后用非托管代码(例如 C++、Delphi)编写一个非常小的存根服务来启动服务。
另一种方法可能是从另一台机器远程启动服务。
sc
命令应该可以很好地完成这项工作。
尝试使用 powershell 安装服务时,我在事件查看器中看到此错误。
我遇到的问题是,我的 powershell 脚本中的“服务名称”和“服务显示名称”的值与我在控制台应用程序的 program.cs 文件中指定的值不同。
值得一提的是,我发现我收到此消息(几乎在服务启动后立即),因为我没有在目标计算机上安装 4.5 版本的 .NET 框架。 我将我使用的版本回滚到版本 4.0(已安装在目标计算机上)并且服务按预期工作。
我想我可能还发现了导致这种重新启动时不启动错误的另一个因素。
如果 Windows 事件日志设置为覆盖事件 > 7 天.. 大小 512kb.. 但此窗口内发生了大量活动,则事件日志实际上已满,因为它无法覆盖生成的事件数在那个时间范围内。如果您将事件日志设置为更大的大小或根据需要覆盖,那么您将不会遇到此问题
我遇到的同样错误是服务器上的 .Net 安装无法正常工作。
要弄清楚这一点:
我制作了一个小型控制台应用程序,其逻辑与执行服务相同,并且我对整个代码段进行了 try-catch,将其全部转储到控制台。
不知道为什么信息没有冒泡,但我们看到了有关框架错误的有价值的消息,否则我们永远不会看到。
我们在 Windows 2016 Server 上遇到同样的问题。
似乎有效的修复是将运行服务的用户从本地服务帐户更改为本地管理员(不确定原因是什么)。
我在 .net 8 中遇到了这个确切的错误,这是由于 Program.cs 中缺少这一行造成的:
builder.Services.AddWindowsService(options =>
{
options.ServiceName = "YourServiceName";
});
如果没有该行,进程将不会响应服务控制消息。