错误1053:服务没有及时响应启动或控制请求

Posted

技术标签:

【中文标题】错误1053:服务没有及时响应启动或控制请求【英文标题】:Error 1053: the service did not respond to the start or control request in a timely fashion 【发布时间】:2010-09-14 13:48:20 【问题描述】:

我最近继承了几个作为 Windows 服务运行的应用程序,但在为它们提供 gui(可从系统托盘中的上下文菜单访问)时遇到问题。

我们需要一个 windows 服务的 gui 的原因是为了能够重新配置 windows 服务的行为而不需要停止/重新启动。

我的代码在调试模式下工作正常,我得到了上下文菜单,一切正常等等。

当我使用命名帐户(即不是本地系统帐户)通过“installutil”安装服务时,服务运行正常,但不会在系统托盘中显示图标(我知道这是正常行为,因为我没有“与桌面交互”选项)。

但问题出在这里 - 当我选择“LocalSystemAccount”选项并检查“与桌面交互”选项时,服务需要 AGES 才能启动,没有明显的原因,我只是不断得到

无法在本地计算机上启动 ... 服务。 错误 1053:服务没有及时响应启动或控制请求。

顺便说一句,我通过注册表将 Windows 服务超时从默认的 30 秒增加到 2 分钟(请参阅http://support.microsoft.com/kb/824344,在第 3 节中搜索 TimeoutPeriod),但是服务启动仍然超时。

我的第一个问题是 - 为什么“本地系统帐户”登录时间比使用非 LocalSystemAccount 登录的服务要长得多,从而导致 Windows 服务超时?这两者之间有什么区别会导致启动时出现如此不同的行为?

其次 - 退后一步,我想要实现的只是一个提供配置 gui 的 Windows 服务 - 我很乐意使用非本地系统帐户(使用命名用户/ pwd),如果我可以让服务与桌面交互(也就是说,在系统托盘中有一个可用的上下文菜单)。这可能吗?如果可以,怎么办?

任何对上述问题的指点将不胜感激!

【问题讨论】:

这是微软对这个错误所说的:support.microsoft.com/kb/307806/en-us 您的应用配置文件中是否有一个或多个部分是加密的?我在特定机器上遇到了同样的问题。在检查并尝试了几乎所有内容后,我尝试将服务部署到该机器,但没有加密任何部分,它对我有用。 【参考方案1】:

在与这条消息抗争了几天后,一位朋友告诉我,您必须使用 Release 版本。当我 InstallUtil 调试版本时,它会给出此消息。发布版本开始正常。

【讨论】:

@Marty 你的朋友有没有告诉你为什么需要这样做?我遇到了同样的问题,但我真的很不满意,不知道为什么会解决它。 我也收到了相同的发布版本消息 嗨@King_Fisher 你有解决问题的办法吗?因为我在发布版本中面临同样的问题。 @Dhawal - 由于我在并行运行多个任务时遇到问题,因此服务停止,然后我使用线程独立运行。 以发布模式构建项目【参考方案2】:

如果您继续尝试让您的服务直接与用户的桌面交互,您将会失败:即使在最好的情况下(即“在 Vista 之前”),这也是非常棘手的。

Windows 内部管理着多个window stations,每个都有自己的桌面。分配给在给定帐户下运行的服务的窗口站与登录的交互式用户的窗口站完全不同。跨窗口站点访问一直不受欢迎,因为它存在安全风险,但虽然以前的 Windows 版本允许一些例外情况,但这些在 Vista 和更高版本的操作系统中大部分已被消除。

您的服务在启动时挂起的最可能原因是它试图与不存在的桌面交互(或假设 Explorer 正在系统用户会话中运行,但事实并非如此),或等待来自一个看不见的桌面。

对这些问题的唯一可靠解决方法是从您的服务中删除所有 UI 代码,并将其移动到在交互式用户会话中运行的单独可执行文件(可执行文件可以使用全局启动以启动组为例)。

您的 UI 代码和您的服务之间的通信可以使用任何 RPC 机制来实现:命名管道特别适用于此目的。如果您的通信需求很少,使用application-defined Service Control Manager commands 也可以解决问题。

要实现 UI 和服务代码之间的这种分离需要付出一些努力:但是,这是使事情可靠运行的唯一方法,并且将来会为您提供良好的服务。

附录,2010 年 4 月:由于这个问题仍然很受欢迎,这里有一种方法可以解决另一个导致“服务没有响应...”错误的常见情况,涉及不响应的 .NET 服务。不会尝试任何有趣的事情,例如与桌面交互,但确实使用 Authenticode 签名的程序集:disable the verification of the Authenticode signature at load time in order to create Publisher evidence,通过将以下元素添加到您的 .exe.config 文件:

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

发布者证据是一个很少使用的代码访问安全 (CAS) 功能:只有在您的服务实际上依赖 PublisherMembershipCondition 的极少数情况下,禁用它才会导致问题。在所有其他情况下,它将不再需要运行时执行昂贵的证书检查(包括吊销列表查找),从而消除永久性或间歇性启动失败。

【讨论】:

我的服务没有用户交互,但我仍然收到错误...似乎尝试安装服务的调试版本也会导致一些问题。不要这样做... @Ortund 似乎 Windows 服务的发布版本对于修复此问题的许多实例至关重要。你知道为什么/是什么造成了不同吗? 我们将 GoAhead Web 服务器嵌入到我们的服务中,这样我们就可以拥有一个运行时用户界面...embedthis.com/goahead/download.html我不为 GoAhead 工作,我们只是他们产品的最终用户.【参考方案3】:

我遇到了这个问题,因为运行我的服务的盒子上缺少框架。盒子有 .NET 4.0,服务是在 .NET 4.5 之上编写的。

我在盒子上安装了以下下载,重新启动,服务启动正常: http://www.microsoft.com/en-us/download/details.aspx?id=30653

【讨论】:

在我看来,这个答案应该更高:) 这就是问题所在。如果您在启动服务时收到适当的消息,这将很有用。当我尝试双击服务(它被编译为 exe)并被提示安装正确版本的 .NET 时,我才赶上来【参考方案4】:

要调试服务的启动,请将以下内容添加到服务的 OnStart() 方法的顶部:

 while(!System.Diagnostics.Debugger.IsAttached) Thread.Sleep(100);

这将停止服务,直到您使用 Debug -> Attach to Process...手动附加 Visual Studio 调试器...

注意:一般来说,如果您需要用户与您的服务进行交互,最好将 GUI 组件拆分为一个单独的 Windows 应用程序,该应用程序在用户登录时运行。然后您使用诸如命名管道或其他形式的 IPC 之类的东西,用于在 GUI 应用程序和您的服务之间建立通信。这实际上是在 Windows Vista 中唯一可能实现的方式。

【讨论】:

这可能行得通,我还没有尝试过。不过我感觉是有原因的……【参考方案5】:

在 OnStart 方法中的服务类中不要进行大量操作,操作系统期望运行服务的时间很短,使用线程启动运行您的方法:

protected override void OnStart(string[] args)

    Thread t = new Thead(new ThreadStart(MethodName)); // e.g.
    t.Start();

【讨论】:

您好,当我遇到问题时,我发现您的解决方案非常有用。我在support.microsoft.com/kb/307806 找到了实际问题,但我无法理解您的解决方案是如何克服这个问题的。请您解释一下。 这为我节省了一场噩梦,我试图在“OnStart”中启动一个永无止境的“while(true)”循环。它给了我这个 1053 错误。 OnStart 需要调用一个简短的方法调用。【参考方案6】:

我在这里是盲目的,但我经常发现服务启动的长时间延迟是由网络功能超时直接或间接引起的,通常是在查找帐户 SID 时尝试联系域控制器时 - 这种情况非常通常通过GetMachineAccountSid() 间接通过,无论您是否意识到,因为该函数是由 RPC 子系统调用的。

有关如何在这种情况下进行调试的示例,请参阅 Mark Russinovich 博客上的 The Case of the Process Startup Delays。

【讨论】:

同样的问题 - 原来我的服务引用的 DLL 之一被标记为“web”,因此被标记为被阻止。防病毒或组策略都阻止了服务启动(CTor 和 OnStart() 都没有在 30 秒内被调用)。取消阻止引用程序集 (***.com/questions/3072359/…) 修复了此问题。这似乎可以通过 Mark Russinovich 的文章来解释。【参考方案7】:

如果您在服务中使用如下调试代码,则可能会出现问题。

#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]

new EmailService()
;
ServiceBase.Run(ServicesToRun);
#else
//direct call function what you need to run
#endif

要解决此问题,请在构建 Windows 服务时删除 #if 条件,因为它无法正常工作。

请使用调试模式的参数,如下所示。

if (args != null && args.Length > 0)

_isDebug = args[0].ToLower().Contains("debug");

【讨论】:

【参考方案8】:

就我而言,问题是缺少.net framework 的版本。

我使用的服务

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

但是.net Framework的服务器版本是4,所以通过将4.5改为4解决了问题:

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>

【讨论】:

【参考方案9】:

复制发布DLL或从发布模式而不是调试模式获取dll并将其粘贴到安装文件夹,它应该可以工作

【讨论】:

【参考方案10】:

我在编写服务时遇到了类似的问题。它工作得很好,然后有一天我开始收到启动错误的超时。它发生在一个和/或两个版本和调试中,具体取决于发生了什么。我已经从 System.Diagnostics 实例化了一个 EventLogger,但是我看到的任何错误都必须在 Logger 能够写入之前发生......

如果您不知道在哪里查找事件日志,在 VS 中,您可以转到服务器资源管理器下的计算机。除了我的服务之外,我开始查看其他一些事件日志。在 Application - .NETRuntime 下,我发现了与启动错误相关的错误日志。基本上,我的服务的构造函数中有一些异常(一个结果是 EventLog 实例设置中的异常 - 这解释了为什么我在我的 Service EventLog 中看不到任何日志)。在以前的版本中,显然还有其他错误(这导致我进行了更改,导致 EventLog 设置中的错误)。

长话短说 - 超时的原因可能是由于各种异常/错误,但使用运行时事件日志可能只会帮助您了解正在发生的事情(尤其是在一个构建工作但另一个构建不工作的情况下)。

希望这会有所帮助!

【讨论】:

【参考方案11】:

安装服务的调试版本并将调试器附加到服务以查看发生了什么。

【讨论】:

安装服务的调试版本并将调试器附加到服务?如何安装?【参考方案12】:

我想在这里回显 mdb 的 cmets。不要走这条路。您的服务不应该有 UI...“无用户交互”就像服务的定义功能。

如果您需要配置您的服务,请编写另一个应用程序来编辑服务在启动时读取的相同配置。但是让它成为一个独特的工具——当你想启动服务时,你启动服务。当你想配置它时,你运行配置工具。

现在,如果您需要对服务进行实时监控,那就有点棘手了(当然这也是我希望通过服务实现的)。现在您正在谈论必须使用进程间通信和其他令人头疼的问题。

最糟糕的是,如果您需要用户交互,那么您会在此处真正断开连接,因为服务不与用户交互。

在你的情况下,我会退后一步问为什么这需要成为一项服务为什么需要用户交互

这两个要求非常不兼容,应该引起警惕。

【讨论】:

【参考方案13】:

我遇到了这个问题,这让我发疯了两天…… 如果你的问题和我的类似:

我在我的windows服务中设置了“用户设置”,所以服务可以自行维护,无需停止和启动服务。好吧,问题在于“用户设置”,其中这些设置的配置文件保存在服务-exe文件版本下运行Windows服务的用户的用户配置文件下的文件夹中。

此文件夹由于某种原因已损坏。我删除了文件夹,服务又像往常一样愉快地开始工作了……

【讨论】:

你能再具体一点吗?我在哪里可以找到这个文件夹?【参考方案14】:

我遇到了这个问题,大约需要一天时间才能解决。对我来说,问题是我的代码跳过了“主要内容”并有效地运行了几行然后完成。这导致了我的错误。它是一个安装 Windows 服务的 C# 控制台应用程序,一旦它尝试使用 ServiceController (sc.Run() ) 运行它,它就会给我这个错误。

在我修复代码以转到主要内容后,它将运行预期的代码:

ServiceBase.Run(new ServiceHost());

然后它就不再出现了。

正如很多人已经说过的那样,错误可能是任何事情,人们提供的解决方案可能会也可能不会解决它。如果他们没有解决它(比如发布而不是调试,将 generatePublisherEvidence=false 添加到您的配置中等),那么问题很可能出在您自己的代码上。

尝试让您的代码在不使用 sc.Run() 的情况下运行(即让 sc.Run() 执行的代码运行)。

【讨论】:

【参考方案15】:

此问题通常发生在您的程序集上缺少某些引用并且通常绑定在运行时失败。

调试将Thread.Sleep(1000) 放入main()。并在下一行执行断点。

然后启动进程并在进程启动时将调试器附加到进程。遇到断点后按 f5。它将抛出缺少程序集或引用的异常。

希望这将解决此错误。

【讨论】:

【参考方案16】:

一旦尝试运行您的 exe 文件。我遇到了同样的问题,但是当我通过双击 exe 文件直接运行它时,我收到一条关于 .Net 框架版本的消息,因为我发布了带有框架的服务项目,但它没有安装在目标机器上。

【讨论】:

【参考方案17】:

将 127.0.0.1 crl.microsoft.com 添加到“Hosts”文件解决了我们的问题。

【讨论】:

【参考方案18】:

花了我几个小时,应该看到事件查看器get_AppSettings()

应用配置中的更改导致了问题。

【讨论】:

【参考方案19】:

我的问题是由于 Windows 服务配置中提到的目标框架是

<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
 </startup>

我尝试安装 Windows 服务的服务器不支持此 .Net 版本。

更改哪个,我可以解决问题。

【讨论】:

【参考方案20】:

我有类似的问题,我遵循的步骤:

    在windows服务构造函数中放入Debugger.Launch() 一步一步看卡在哪里

我的问题不是由于任何错误。 我有一个 BlockingCollection.GetConsumingEnumerable() 导致 Windows 服务等待。

【讨论】:

【参考方案21】:

我也有这个问题。我通过将登录帐户更改为本地系统帐户使其工作。在我的项目中,我将其设置为作为本地服务帐户运行。因此,当我安装它时,默认情况下它使用的是本地服务。我正在使用 .net 2.0 和 VS 2005。所以安装 .net 1.1 SP1 不会有帮助。

【讨论】:

【参考方案22】:

本地系统帐户和本地服务都对我不起作用,然后我将其设置为网络服务,这工作正常。

【讨论】:

【参考方案23】:

就我而言,由于真正的错误,我遇到了这个问题。在调用服务构造函数之前,成员变量的一个静态构造函数失败了:

    private static OracleCommand cmd;

    static SchedTasks()
    
        try
        
            cmd = new OracleCommand("select * from change_notification");
        
        catch (Exception e)
        
            Log(e.Message); 
            // "The provider is not compatible with the version of Oracle client"
        
    

通过添加 try-catch 块,我发现异常是由于错误的 oracle 版本而发生的。安装正确的数据库解决了这个问题。

【讨论】:

【参考方案24】:

我也遇到了类似的问题,发现加载程序集有问题。我在尝试启动服务时立即收到此错误。

要快速调试问题,请尝试使用 ProcDump http://technet.microsoft.com/en-us/sysinternals/dd996900 通过命令提示符运行服务可执行文件。它应提供有关确切错误的充分提示。

http://bytes.com/topic/net/answers/637227-1053-error-trying-start-my-net-windows-service帮了我不少忙。

【讨论】:

【参考方案25】:

这对我有用。基本上确保登录用户设置为正确的。但是,这取决于帐户基础架构的设置方式。在我的示例中,它使用 AD 帐户用户凭据。

在启动菜单搜索框中搜索“服务” -在服务中找到所需的服务 -右键单击并选择登录选项卡 -选择“此帐户”并输入所需的内容/凭据 - 好了,照常启动服务

【讨论】:

【参考方案26】:

如果您有用于测试的 windows 窗体,请确保启动对象仍然是服务而不是 windows 窗体

【讨论】:

【参考方案27】:

我们已将 Log4Net 配置为记录到数据库表。表变得如此之大,以至于服务在尝试记录消息时超时。

【讨论】:

【参考方案28】:

以管理员身份打开服务窗口,然后尝试启动服务。这对我有用。

【讨论】:

【参考方案29】:
    在发布模式下构建项目。 将所有 Release 文件夹文件复制到源路径。 在管理访问中使用命令提示符窗口执行 Window 服务。 永远不要从源路径中删除文件。

至少这对我有用。

【讨论】:

【参考方案30】:

发布版本对我不起作用,但是,我查看了事件查看器和应用程序日志,发现 Windows 服务在尝试创建事件日志时抛出了安全异常。我通过手动添加具有管理权限的事件源来解决此问题。

我遵循了 Microsoft 的这份指南:

打开注册表编辑器,运行 --> regedit 找到以下注册表子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application 右键单击 Application 子项,指向 New,然后单击 Key。 键入 Windows 服务中使用的事件源名称作为键名。 关闭注册表编辑器。

【讨论】:

以上是关于错误1053:服务没有及时响应启动或控制请求的主要内容,如果未能解决你的问题,请参考以下文章

错误1053:服务没有及时响应启动或控制请求

错误1053:服务没有及时响应启动或控制请求

C# 错误 1053 服务没有及时响应启动或控制请求

windows服务安装启动报错误1053:服务没有及时响应启动或控制请求

windows服务程序运行时错误显示“错误1053服务没有及时响应启动或控制请求。”怎么办?

windows服务程序运行时错误显示“错误1053服务没有及时响应启动或控制请求。”怎么办?