Windows无法在Win Server 2008 R2 SP1上启动服务(错误1053)

13

这个问题似乎被广泛讨论,但我在找到解决方案方面遇到了困难。

我的服务设置为在“本地系统”帐户下运行。在我安装了Windows 7 SP1(64位)的第一台机器上,一切都按预期工作。但是,在我尝试在安装有Windows Server 2008 R2 SP1(64位)的第二台机器上启动服务后,不到一秒钟,我就遇到了这个令人恼火的错误:

Windows could not start the ProService service on Local Computer
Error 1053: The service did not respond to the start or control request in a timely fashion

系统日志显示2个条目:

The ProService service failed to start due to the following error: 
The service did not respond to the start or control request in a timely fashion.

并且:

A timeout was reached (30000 milliseconds) while waiting for the ProService service to connect.
实现如下:

Program.cs:

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
    ServiceBase.Run(new ServiceBase[] { new ProService() });
}

static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    if (e != null && e.ExceptionObject != null)
    {
        Logger.Record(e.ExceptionObject);
    }            
}

ProService.cs:

public ProService()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    try
    {
        RequestAdditionalTime(10000);
        FireStarter.Instance.Execute();
    }
    catch (Exception e)
    {
        Logger.Record(e);
        throw;
    }            
}

OnStart方法只是启动了一个新线程,所以执行几乎不需要加载时间。我使用RequestAdditionalTime语句只是为了排除这个问题是我的问题的来源。此外,正如您所见,我处理了所有异常,但在启动期间没有将任何异常写入我的自定义服务事件日志(顺便说一句:日志记录在第一台win7计算机上工作)。如何调查发生了什么?


FireStarter.Instance.Execute() 发生了什么?你能贴一些该方法的代码吗? - Marcel N.
如果错误发生的时间少于一秒钟,那么可能会出现程序集绑定异常。您可以通过启用FusionLog并使用FusionLog Viewer来跟踪此问题:http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.100).aspx。另外,请确保第二台计算机上安装了适当的.NET框架。 - Marcel N.
FireStarter.Instance.Execute() 包含 var thread = new Thread(x => WatchThread(new ThreadStart(ExecuteInternal))); thread.Start(); 框架已安装, 两台机器上一样。不幸的是,在 fuslogsw 窗口中没有任何输出(我完成了来自此来源的所有步骤:http://www.neovolve.com/post/2010/05/28/Resolving-assembly-bind-failures-on-a-server.aspx,然后尝试启动我的服务)。 - jwaliszko
那么我能想到的唯一有用的方法(也是我自己使用过的)就是在该机器上使用Intellitrace独立收集器,收集有关执行路径的详细跟踪信息。有关所需设置的更多信息,请参见此处:http://msdn.microsoft.com/en-us/library/vstudio/hh398365.aspx。一旦启动并运行,您将能够准确地查看执行情况,并希望能够确定问题所在。 - Marcel N.
5个回答

10
我已经通过以下几个步骤弄清楚了问题的原因:
  1. 我编写了控制台应用程序,其实质上是从服务的 OnStart 方法中提取的内容。
  2. 我执行了控制台应用程序,应用程序正常启动。
  3. 我将服务配置文件的内容复制到控制台应用程序配置文件中。
  4. 我再次执行了控制台应用程序,但应用程序立即和悄无声息地崩溃了(与我们的服务行为惊人地相似,说明出了问题)。
  5. 我比较了来自服务和原始控制台应用程序的两个配置文件。结果发现它们之间存在一些差异。其中一个条目就是问题的源头(删除该条目后,一切正常运行):

    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    
    所以基本上我有一个过时的配置文件。之前的服务是在.NET 4.5下编译的,然后我将框架更改为4.0并将文件部署到服务器上,但保留了以前的配置文件(我更改了目标框架,因为我的开发机器有.NET 4.5,而服务器没有)。我原本不会想到这些代码会隐藏所有问题,也没有任何合理的信息可以帮助跟踪混乱状态。

非常感谢您的回答。这为我节省了很多时间! - Vitalii

2

检查是否缺少依赖项/DLL文件。

如果尚未这样做,请允许将您的服务作为常规应用程序调用(这是长期调试的绝佳技术),并查看它是否可以在Windows 2008计算机上正确启动。

如果以这种方式工作,则可能存在在LocalSystem帐户中运行的问题。从在LocalSystem帐户下运行的命令提示符中启动您的应用程序(此处有示例设置)。


1

我尝试了以下修复措施,这些措施是在链接提供的:

  1. 点击“开始”,点击“运行”,键入“regedit”,然后点击“确定”。

  2. 定位并单击以下注册表子键: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

  3. 在右窗格中,找到ServicesPipeTimeout项。
    注意:如果ServicesPipeTimeout项不存在,则必须创建它。要执行此操作,请按照以下步骤操作:
    a. 在“编辑”菜单上,指向“新建”,然后单击“DWORD值”。
    b. 键入ServicesPipeTimeout,然后按ENTER键。
  4. 右键单击ServicesPipeTimeout,然后单击“修改”。
  5. 单击“十进制”,键入60000,然后单击“确定”。
    此值表示服务超时前等待的时间(毫秒)。
  6. 重新启动计算机。

但是我仍然无法启动服务。

对我有效的解决方法是:

  1. 打开services.msc
  2. 双击你要启动的服务。
  3. 进入登录选项卡
  4. 将登录方式更改为本地系统账户。
  5. 更改后尝试启动服务。(仍然出现1053错误)
  6. 再次进入登录选项卡,将其更改为网络服务(设置一个随机新密码)
  7. 再次尝试启动服务。(服务完美启动)

0

我尝试了以下步骤,它非常有效:

1.打开services.msc 2.双击您要启动的服务。 3.选择登录选项卡 4.将“登录为”更改为本地系统帐户。 5.更改后尝试启动服务。(仍然出现1053错误) 6.再次选择登录选项卡,将其更改为网络服务(设置一个新的随机密码) 7.再次尝试启动服务。(服务已经完美启动)

但我只想知道问题出在哪里。


0
安装服务后,我必须为安装文件夹授予完全控制权限(所有人)。然后,我的服务将完美地启动。

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