【问题标题】:Starting a windows service fails with error 1053启动 Windows 服务失败并出现错误 1053
【发布时间】:2010-10-22 01:53:56
【问题描述】:

我有一个无法启动的 Windows 服务,出现错误“错误 1053:服务没有及时响应启动或控制请求”。

在我的调试器中运行该服务工作正常,如果我双击远程计算机上的服务 .exe,则会弹出一个控制台窗口并继续运行而没有问题 - 我什至可以看到显示该程序的日志消息正在以应有的方式处理一切。

该服务之前一直运行良好,尽管这是我个人第一次尝试使用对程序所做的最新更改来部署它。我已经评估了这些更改,但无法弄清楚它们是如何导致此问题的,特别是因为在未作为服务启动时一切运行良好。

服务实现的 StartRoutine() 方法是空的,所以应该“及时”返回。

我检查了计算机上的事件日志,除了在 30 秒的必要时间范围内没有收到服务的回复外,它没有提供任何其他信息。

既然它在我的机器上运行,并且作为一个双击的可执行文件,我将如何弄清楚它为什么作为服务失败?

哦,它是 .NET 2.0,所以它不应该受到表现出这种症状的 1.1 框架错误的影响 (http://support.microsoft.com/kb/839174)

盒子是一台运行 SP2 的 windows server 2003 R2 机器。

【问题讨论】:

  • 尝试在仅安装 .Net 2.0 的服务器上启动 .NET 4.0 编译服务时出现此错误

标签: windows-services .net-2.0 windows-server-2003


【解决方案1】:

这是一个误导性错误。这可能是一个未处理的异常。

清空您的 OnStart() 处理程序,然后在您的构造函数中尝试此操作...

    public MainService()
    {
        InitializeComponent();

        try
        {
            // All your initialization code goes here.

            // For instance, my exception was caused by the lack of registry permissions
            ;
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("Application", ex.ToString(), EventLogEntryType.Error);
        }
    }

现在检查系统上的 EventLog 是否存在应用程序错误。

【讨论】:

    【解决方案2】:

    可能有很多问题,在出现问题的机器上获取堆栈跟踪可能会有所帮助。有很多方法可以做到这一点,但关键是你必须看看代码中哪里出错了。

    您可以使用remote debugging 执行此操作,但简单的事情可能是只记录到事件记录器,或者如果您有记录,则将其归档。从字面上看,将 "WriteLine("At class::function()") 放在代码的各个部分,看看你是否已经做到了。

    这至少会让您找到正确的方向(最终是代码)。

    更新

    有关使用 WinDbg 解决启动问题的详细信息,请参阅 Microsoft 的 How to Debug Windows Services 文章。

    related question 详细介绍了调试用 .NET 编写的服务的好方法。

    【讨论】:

    • 在典型的 Microsoft 方式中,链接的文档页面已经完全改变...没有提及 WinDbg 或任何其他在实际调试器中运行服务的有用方法。我们是否真的希望将WriteLine 呼叫无处不在?当您的日志文件甚至无法在服务中运行,但在控制台应用程序中一切正常时,该怎么办?这个问题似乎没有很好的解决方案,这让我想在雷德蒙德扔核弹:@
    【解决方案3】:

    我同意 Scott 的观点,找出正在发生的事情的最简单方法是在启动代码中添加一些痕迹(也许它甚至不会出现在您的启动代码中)。

    如果这没有帮助,您可以在此处发布您的代码,以便其他人可以查看。

    【讨论】:

      【解决方案4】:

      可能缺少一些依赖,试试这个:
      - 注销您的服务
      - 重新注册

      如果注册失败意味着缺少模块。

      【讨论】:

        【解决方案5】:

        如果 StartRoutine 为空,您可能正在其他地方启动它。

        IIRC 你需要触发一个工作线程,然后从 StartRoutine 返回。

        【讨论】:

        • 看起来代码是通过挂钩ServiceBase.Elapsed事件来执行的,该事件被挂钩在构造函数中(它之前也是这样做的,当它工作时)
        【解决方案6】:

        可能导致此错误的一个问题是,如果需要部署的 Windows 服务包含一些错误,即它可能是简单的授权错误或任何事情,在我的情况下,我引用了一些用于记录的文件夹和文件不存在,但是当提供这些文件和文件夹的正确路径时,它解决了我的问题。

        【讨论】:

          【解决方案7】:

          我浏览了关于这个特定主题的所有帖子,但没有一个回复解决了这个问题,所以我添加了这个回复,以防这对其他人有帮助。诚然,这仅适用于新服务,不适用于此特定情况。

          我正在编写一个文件监听服务。作为一个控制台应用程序,它运行良好。当我将它作为服务运行时,我得到了与上面相同的错误。我不知道(许多关于服务的 MSDN 文章很方便地省略了)是您需要从 ServiceBase.Run(YourClassName()); 中执行您的类。否则,您的应用程序将执行并立即终止,并且由于它已终止,即使没有发生错误或异常,您也会收到上述错误。这是一篇关于此的文章的链接。它实际上讨论了将您的应用设置为双重用途 - 控制台应用和服务:Create a combo command line / Windows service app

          【讨论】:

            【解决方案8】:

            我遇到了这个问题,问题的根源是配置文件。我在记事本中编辑了它,记事本添加了一个特殊字符,导致服务无法正常运行,因为配置文件被破坏了。我在notepadd++中看到了那个特殊字符,删除后,服务开始像以前一样成功运行。

            【讨论】:

              【解决方案9】:

              在我的情况下,我正在安装 Windows 服务的服务器上没有安装正确的 .NET 框架。

              【讨论】:

                【解决方案10】:

                另一个原因是如果您将“调试”模式下的 DLL 复制到安装文件夹,则会出现此问题。您需要做的是在“发布”模式下运行项目复制 DLL 或直接形成发布文件夹而不是调试文件夹,然后将该DLL复制到安装文件夹中,它会起作用。你可以看到DLL的大小减少,它不会包含任何调试符号,就像那样

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-09-25
                  • 2011-09-10
                  • 2012-11-14
                  • 2011-11-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-17
                  相关资源
                  最近更新 更多