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

90

我已经创建并安装了一项服务多次。最初它运行良好,但在服务代码进行更改后,当我在Services.msc中重新启动服务时,它开始出现错误:

错误1053:服务未能按时响应启动或控制请求

代码:

public partial class AutoSMS : ServiceBase
{
    public AutoSMS()
    {
        InitializeComponent();
        eventLog1.Clear();

        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";

        Timer checkForTime = new Timer(5000);
        checkForTime.Elapsed += new ElapsedEventHandler(checkForTime_Elapsed);
        checkForTime.Enabled = true;

    }

    protected override void OnStart(string[] args)
    {
        eventLog1.WriteEntry("In OnStart");
    }

    protected override void OnStop()
    {
        eventLog1.WriteEntry("In onStop.");
    }


    void checkForTime_Elapsed(object sender, ElapsedEventArgs e)
    {
        string Time = "15:05:00";
        DateTime dateTime = DateTime.ParseExact(Time, "HH:mm:ss",
                                        CultureInfo.InvariantCulture);

        if (DateTime.Now == dateTime) ;
            eventLog1.WriteEntry(Time);
    }
}

这是我的主方法代码

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
    { 
        new AutoSMS() 
    };
    ServiceBase.Run(ServicesToRun);
}

我也尝试了以下步骤:

  • 转到开始菜单 > 运行 > 输入 regedit
  • 导航到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
  • 在控制文件夹选中的情况下,右键单击右侧窗格并选择新建 DWORD 值
  • 将新 DWORD 命名为:ServicesPipeTimeout
  • 右键单击 ServicesPipeTimeout,然后单击“修改”
  • 单击十进制,输入“180000”,然后单击“确定”
  • 重新启动计算机

我曾使用以下命令进行安装和卸载:

installutil AutoSMS.exe

installutil /u AutoSMS.exe

Windows事件日志显示了什么?或者它显示“错误1053”?这可能是一个权限问题。尝试将服务作为“本地系统”用户运行。 - Silvermind
1
将来使用System.Diagnostics.Debugger.Launch()在Main()方法中可能很有用,这样您就可以使用调试器。 - user420667
32个回答

52

在我的案例中,我在调试模式(debug mode)下发布了服务。

解决方案是:

  • 将解决方案切换到发布模式(release mode)
  • 使用命令卸载旧的服务InstallUtil -u WindowsServiceName.exe
  • 再次安装服务 InstallUtil -i WindowsServiceName.exe

这之后它完美运行。


6
我曾经费了很长时间才明白这个问题。不停地检查配置文件和事件日志,直到我读到这个答案,然后我因为忘记切换构建到发布版而感到非常遗憾。对我来说,这个方法有效! - cameronjchurch

37

正如其他人所指出的,这个错误可能有许多原因。但希望这能帮助某些人,我将分享我们遇到的情况。对我们来说,我们的服务已升级到.NET 4.5,但服务器没有安装.NET 4.5。


5
"Multitude is correct. The error could appear if you have errors within your service. So related to your code rather than the framework." 的意思是:多数情况下是正确的。如果出现错误,可能是由于您的服务中存在错误,因此与您的代码有关,而不是框架本身。 - Tim B James
1
关于.NET的话题 - 我们收到了这条消息,因为我们的Windows服务正在运行.NET 2.0,当我们将其移动到一个没有安装.NET 2.0的Windows 2019实例上时,我们遇到了这个错误。我们花了一整天的时间才找出这个问题 - 希望这可以帮助其他人。 - Dave
我已经安装了4.5版,但缺少了4.5.2的更新。 - Inphinite Phractals
在我的情况下,导致此错误的原因是EXE未实现ServiceBase OnStart或OnStop。 - Alexandra
1
这仍然是一个相关的答案。我们的一些服务在升级到Server 2016后停止工作。安装缺失的.NET Framework运行时(在我们的情况下为4.7.2)使它们重新工作了。 - Ben Seymour

35

在花费一些时间尝试了无法解决问题的解决方案后,我遇到了这篇博客。它建议将服务初始化代码放入try/catch块中,像这样,并添加EventLog。

using System;
using System.Diagnostics;
using System.ServiceProcess;

namespace WindowsService
{
    static class Program
    {
        static void Main()
        {
            try
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new Service1() 
                };
                ServiceBase.Run(ServicesToRun);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("Application", ex.ToString(), EventLogEntryType.Error);
            }
        }
    }
}

然后,卸载旧服务,使用这些修改重新部署服务。启动服务并检查事件查看器/应用程序日志。您将看到真正的问题所在,这是超时的根本原因。


5
好主意,但在我的情况下它并没有记录任何东西... 仍然出现这个恼人的消息,却没有任何提示! - Piero Alberto
在我的情况下,初始化服务正在加载自定义配置文件,并且路径被设置为相对路径,由于某种原因,服务不喜欢那样。将路径更改为完整路径即可解决问题。 - Etienne

13
我遇到了相同的问题,不确定如何解决。是的,这是因为服务中抛出了异常,但您可以遵循一些通用指导方针来纠正这种情况:
  • 检查您是否编写了正确的代码以启动服务: ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new WinsowsServiceToRun() }; ServiceBase.Run(ServicesToRun);
  • 您需要确保在类WinsowsServiceToRun中有某种无限循环正在运行

  • 最后,可能会有一些代码没有记录任何内容并突然关闭程序(这就是我的情况),在这种情况下,您将不得不遵循旧的调试方式,需要将一行写入源(文本/ db / wherever)。我面临的问题是,由于运行服务的帐户不是“管理员”,所以代码只是掉落,并且如果它尝试写入“Windows事件日志”,则不记录任何异常,即使代码已经记录异常。实际上,不需要管理特权即可记录到Even Log,但是需要定义源。如果事件的源尚未在系统中定义,并且服务尝试在没有管理员特权的情况下首次记录它,则会失败。要解决此问题,请按以下步骤操作:

    1. 使用管理员权限打开命令提示符
    2. 粘贴命令:eventcreate /ID 1 /L APPLICATION /T INFORMATION /SO <<Source>> /D "<<SourceUsingWhichToWrite>>"
    3. 按回车键
    4. 现在启动服务

1
很好的答案,在我的情况下问题是ServiceBase.Run(ServicesToRun);这行永远没有被访问到。由于该服务也被设计为可以在命令行中运行,我错过了配置。一个遗漏的配置导致了浪费数小时的时间... - mkb
@mkb:是的,配置错误确实会花费很多时间。在上面提到的问题中,我遇到了其中两个,花了我几个小时才解决。感谢您的点赞和编辑。 - Akash Sahay
1
@abatonime 那个时候,我在 app.config 中添加了一个关键字来决定它是作为 Windows 服务还是普通的命令行程序运行。类似 runasservice="true",当我将其设置为 false 时,ServiceBase.Run(ServicesToRun); 就不会被调用。 - mkb
1
@mkb 好的,谢谢。在我的情况下,我使用了 System.Diagnostics.Debugger.Launch() 来启动 VS 中的调试,并发现由于当前目录设置为 windows/system32 而引发了异常。 - John
1
@Abatonime 做得好,我能感受到,该死的目录错误 :) - mkb
显示剩余3条评论

10

我刚在 .Net 4.5 上本地尝试了这段代码,服务在我的机器上可以正确启动和停止。我猜测你的问题可能与创建EventLog源有关。

这个方法:

EventLog.SourceExists("MySource")

根据此处的文档,要求运行代码的用户必须是管理员:

http://msdn.microsoft.com/zh-cn/library/x7y6sy21(v=vs.110).aspx

检查服务是否以具有管理员权限的用户身份运行。


我使用管理员帐户启动了service.msc,并尝试使用命令提示符作为管理员安装和卸载service.exe...但仍然无法正常工作。 - Neeraj Verma
你需要检查实际服务正在运行的帐户,而不是以管理员身份运行命令提示符来安装服务。在“服务”中,右键单击“AutoSMS”服务,选择“属性”->“登录”选项卡。尝试选择“本地系统”帐户的顶部单选按钮。 - devduder
.NET Framework版本是解决方案的关键,没有其他。我将.NET Framework 4.0替换为4.5后,服务顺利启动。 - Anand Rajan
当我注释掉EventLog的东西时,我的服务开始工作了。但是我需要EventLog,尽管我以管理员身份运行了命令提示符。我认为以管理员身份运行命令提示符并不能解决问题。 - Faizan Mubasher

9

这是因为微软Windows服务控制在某些情况下会控制服务的状态。如果服务在30秒内没有响应,那么就会出现这个错误。

您可以修改注册表,以便服务有更多时间来响应。

Go to Start > Run > and type regedit
Navigate to: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
With the control folder selected, right click in the pane on the right and select new DWORD Value
Name the new DWORD: ServicesPipeTimeout 
Right-click ServicesPipeTimeout, and then click Modify
Click Decimal, type '180000', and then click OK
Restart the computer

或者确保在该时刻没有其他进程正在与服务通信,也许存在冲突,我不知道。


8
如果您想将.NET Core 3.1可执行文件注册为Windows服务,请确保添加了版本为3.1.7或更高版本的nuget包Microsoft.Extension.Hosting.WindowsServices,并像以下示例中所示初始化hostBuilder:
using Microsoft.Extensions.Hosting;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] arguments)
        {
            IHostBuilder hostBuilder = Host.CreateDefaultBuilder(arguments);
            hostBuilder.UseWindowsService();
            hostBuilder.Build().Run();
        }
    }
}

现在,您可以安装可执行文件并将其作为Windows服务启动:

sc.exe create ConsoleApp1 binPath= "<BIN_PATH>\ConsoleApp1.exe"

这里重要的部分是.UseWindowsService()应该在最后调用(就在.Build()之前)。谢谢! - Yuriy Ivaskevych
省了我接下来的8个小时 :) - Niyazi Babayev

5
在今天早上我遇到的情况中,罪魁祸首是一个格式不正确的配置文件。该配置文件有一个关闭注释标签,但没有相应的开放注释标签。因此,请仔细检查您的配置文件是否存在错误。

是的,那就是我遇到的问题。但要了解问题的详细信息,您可以检查事件查看器 > Windows日志 > 应用程序。其中的堆栈跟踪帮助我更新配置文件。 - mihkov

5

在花费了太多时间后,我发现尽管我正确使用了EventLog,但它导致了所有的混乱。

无论谁解决这个问题,我建议你摆脱EventLog。使用更好的工具,比如"log4net"。


5

我遇到了完全相同的问题,我所做的就是在编译dll时将Debug模式更改为Release。这解决了我的问题,为什么?我不知道,我已经在SO上提出了问题


我遇到了完全相同的问题和解决方案。我不确定为什么这样做有效,但是谢谢! - BlueRaja - Danny Pflughoeft
这对我也起作用了。在使用调试模式释放DLL时遇到了问题。在使用发布模式构建解决方案后,它完美地工作了。 - RahulGo8u

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