重启后出现“等待服务连接时超时”错误。

48
我有一个自定义的 Windows 服务,我在许多 Hyper-V 虚拟机上运行。作为一些自动化测试的一部分,虚拟机每小时重启几次。服务设置为自动启动,几乎所有时间都可以正常启动。
然而,大约5%的时间,没有我能够分辨出的模式,该服务无法启动。当它失败时,事件查看器中会出现一个错误提示:
“在等待 My Service Name 服务连接时达到超时(30000 毫秒)。”
当这种情况发生时,我可以手动启动服务或重新启动,服务将正常启动。
我无法弄清楚的是,在我的代码中似乎没有出现30秒超时。服务类的 OnStart() 方法的第一行记录“Starting…”到其 log4net 日志中。当服务无法启动时,我根本没有任何日志记录,这表明 log4net 无法记录日志,或者超时发生在我的 OnStart() 调用之前。
该服务在各种操作系统上运行,从 XP 到 Win7 和 2008R2,我知道将服务设置为延迟启动可能会解决 Vista 和更高版本的问题,但那似乎是一个 hack。
由于它如此间歇性地发生并且在系统启动期间发生,我无法进行远程调试,我对进一步尝试找出原因感到困惑。有什么想法吗?

1
您的服务是否依赖于其他服务,或者其他服务是否依赖于您的服务才能启动? - Adam Gritt
1
不,它是完全独立的。 - Zack Elan
1
你正在使用什么类型的log4net appender? - Adam Gritt
1
一个 RollingFileAppender,我认为它非常简单。 - Zack Elan
6个回答

8
我的猜测 - 只是猜测 - 是启动期间磁盘大量抖动,以至于在Windows为服务启动分配30秒内,.NET Framework本身无法启动。一个笨拙的解决方法可能是将服务设置为手动启动,然后编写一个非托管代码(例如C ++,Delphi)的非常小的存根服务来启动该服务。
另一种方法可能是从另一台机器远程启动服务。sc命令应该可以很好地完成这项工作。

在我的情况下,OnStart 中的第一行是使用 log4net 进行日志记录,但我从未看到过这个日志消息(我从服务中没有看到任何日志消息)。计算机很旧,磁盘也不是很快。将 ServicesPipeTimeout 更改为 60 秒后,服务开始启动。(http://answers.microsoft.com/en-us/windows/forum/windows_7-performance/several-service-control-manager-issues-event-ids/5eb047bb-e5bf-47b3-a661-299f6f9835ba) - Alexander Bartosh

6

在尝试使用powershell安装服务时,我在事件查看器中发现了这个错误。

我的问题是,在powershell脚本中,“服务名称”和“服务显示名称”的值与我在控制台应用程序的program.cs文件中指定的值不同。


1
谢谢您分享这个建议。我已经在我的app.config中更新了这些值,然后它就开始工作了。之前我一直很苦恼。每次我尝试启动我的服务时,它都会基本上立即失败 - 肯定不会等待30秒,这让我质疑事件查看器中的30,000毫秒超时消息。这个错误报告真是太糟糕了 - 完全与超时无关! - lg1382

3

就我所知,我发现在目标机器上没有安装 .NET framework 的 4.5 版本导致我在服务启动时几乎立即收到了这条消息。我将使用的版本回滚到已在目标机器上安装的 4.0 版本,然后服务按预期工作。


谢谢!不幸的是,它并没有告诉你框架缺失的信息 :/ - user145400

1

我认为我可能还发现了另一个导致这种重启错误的因素。

看起来,如果Windows事件日志设置为覆盖事件> 7天..大小512kb..但在此时间窗口内发生了大量活动,则事件日志实际上已满,因为它无法覆盖在该时间范围内生成的事件数量。如果您将事件日志设置为更大的大小或根据需要覆盖,则不会遇到此问题。


0

我遇到的同样错误问题是服务器上的 .Net 安装未能正确工作。

为了找出问题所在:

我创建了一个小型控制台应用程序,逻辑与执行服务完全相同,并在整个代码段周围添加了 try-catch,将所有内容都输出到控制台。

不确定为什么信息没有冒泡上来,但我们看到了有关 Framework 错误的有价值的消息,否则我们永远不会看到这些消息。


0

我们在Windows 2016服务器上遇到了同样的问题。

一个看起来有效的解决方法是将服务运行的用户从本地服务账户更改为本地管理员(不确定原因是什么)。


原因可能是“本地服务”服务在操作系统启动时存在I/O瓶颈时更早启动,而用户账户服务稍后启动,并且更有可能成功。 - flam3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接