我有一个自定义编写的Windows服务,我在许多Hyper-V VM上运行。作为正在运行的一些自动化测试的一部分,VM每小时重启几次。该服务设置为自动启动,几乎所有时间,它都启动正常。
然而,可能有5%的时间,没有我能辨别的模式,服务无法启动。当它失败时,我在事件查看器中收到错误
等待我的服务名称服务连接时达到超时(30000毫秒)。
发生这种情况时,我可以手动启动服务,或者重新启动服务,服务将正常启动。
我无法弄清楚的是,我的代码中似乎没有发生30秒超时。我的服务类的OnStart()方法的第一行将“Starting ...”记录到其log4net日志中。当服务无法启动时,我甚至根本没有记录任何内容,这表明log4net无论出于何种原因都无法登录,或者在我的OnStart()被调用之前发生了超时。
该服务运行在各种操作系统上,从XP一直到Win7和2008R2,我知道将服务设置为延迟启动可以解决这个问题,对于Vista及更高版本,但这似乎是一个黑客。
我无法对此进行远程调试,因为它间歇性地发生并且在系统启动期间发生了这种情况,并且我不知道如何进一步尝试弄清楚发生了什么。有什么想法吗?
答案 0 :(得分:6)
我的猜测 - 就是它的全部 - 是磁盘在启动过程中发生剧烈颠簸,直到.NET框架本身没有在Windows分配服务启动的30秒内启动。
一个kludgy解决方法可能是将服务设置为手动启动,然后在非托管代码(例如C ++,Delphi)中编写一个非常小的存根服务来启动服务。
另一种方法可能是从另一台机器远程启动服务。 sc
命令可以很好地完成工作。
答案 1 :(得分:3)
为了它的价值,我发现我收到了这条消息(几乎是在服务启动后立即),因为我没有在目标机器上安装4.5版本的.NET框架。我将我使用的版本回滚到版本4.0(已经安装在目标机器上),并且服务按预期工作。
答案 2 :(得分:2)
尝试使用PowerShell安装服务时,我在事件查看器中看到此错误。
我遇到的问题是我对#34;服务名称"有不同的价值观。和"服务显示名称"在我的powershell脚本中,我已经在我的控制台应用程序的program.cs文件中指定了那些。
答案 3 :(得分:1)
我想我可能还发现了另一个促成重启错误的因素。
如果Windows事件日志设置为覆盖事件> 7天...大小512kb ..但是在这个窗口中发生了很多活动,然后事件日志实际上已满,因为它无法覆盖在该时间范围内生成的事件数。如果您将事件日志设置为更大的大小或根据需要覆盖,那么您将不会遇到此问题
答案 4 :(得分:0)
我遇到同样错误的问题是服务器上的.Net安装无法正常工作。
想出这个:
我创建了一个与执行服务具有相同逻辑的小型控制台应用程序,并且我在整个代码片段周围进行了尝试捕获,将其全部转移到控制台。
不确定为什么信息没有冒出来,但我们看到了有关框架错误的有价值的消息,我们从未见过这些消息。
答案 5 :(得分:0)
我们在Windows 2016 Server上遇到同样的问题。
似乎有效的修复方法是将服务从本地服务帐户运行的用户更改为本地管理员(不确定原因是什么)。