安装Windows服务

3
我已经在ASP.NET 4.0中创建了一个Windows服务,然后在管理员命令提示符下使用以下命令安装服务:

C:\Windows\system32>sc create EnviroTracker1 binpath= "D:\Freelance Work\SuperExpert\git EnviroTrack\EnviroTrack\EnviroTrackerService\bin\Release\EnviroTrackService.exe"
[SC] CreateService SUCCESS

之后,我进入管理员工具->服务,并尝试启动服务,但是我收到了以下错误:
---------------------------

Services

---------------------------

Windows could not start the EnviroTracker1 service on Local Computer.

Error 1053: The service did not respond to the start or control request in a timely fashion.

---------------------------

OK

---------------------------
我也尝试了installutil。在那种情况下,服务已被安装,其启动类型为自动,并且在服务属性窗口中,服务状态为自动。请为我提供解决方案。
谢谢。

听起来你的服务已经安装,但是当服务尝试启动时抛出了一个异常。 - Mutt
你的 OnStart 方法中有太多的函数了吗?事件查看器中没有错误吗? - Andrew
3个回答

2

编辑:正如您在评论中提到的那样,Thread.Sleep 导致 OnStart 等待了 100 秒以上,从而导致错误消息。

如果使用 sc stop EnviroTracker1 停止服务失败,您可以将该服务标记为删除。在重新启动计算机后,该服务将被删除。sc delete EnviroTracker1


http://support.microsoft.com/kb/839174

错误代码 1053 表示服务在 OnStart 方法中花费了超过 30 秒的时间。这太长了。在我的服务 OnStart 中,我只是启动一个间隔为 2 秒的计时器。我会在计时器的过期函数中完成我通常会在 OnStart 中完成的所有工作。这样我的初始化可以耗费自己所需的时间,而 OnStart 可以在一秒内完成。

为了帮助您解决特定的问题,我们需要具体的信息。您在某个地方提到似乎是权限问题。是什么让您有这种感觉呢?更重要的是,为什么不加入一些日志记录或异常处理。如果出现异常,那么堆栈跟踪将有所帮助。日志记录语句将帮助您和我们找到问题所在的位置。

实际上,您还可以将调试器附加到服务。由于看起来它在 OnStart 中卡了 30 秒,您应该有足够的时间将 Visual Studio 调试器附加到服务实例。

也许您可以发布 OnStart 方法的代码……您知道的,帮助我们帮助您 :)


1
你需要有一个派生自 ServiceBase 的类,并在 OnStartOnStop 方法中添加代码。一旦你完成这个,你可以在设计器视图中右键单击任何位置,然后选择 "添加安装程序",这将添加必要的代码到程序集中,使得 installutil 能够注册该服务。
public class YourService : ServiceBase
{
  public static void Main(string[] args)
  {
    ServiceBase.Run(new ServiceBase[] { new YourService() });
  }

  protected overrides void OnStart(string[] args)
  {
    // Add code to start your logic here. Try to return immediately.
  }

  protected overrides void OnStop()
  {
    // Add code to stop your logic here.
  }
}

OnStart方法中,你可能等待的时间太长了。你需要确保只做足够的工作来启动服务的逻辑。这意味着你可能需要启动一个新线程或以其他方式异步地启动你的逻辑。


@Brain:我已经完成了所有的工作。只是在启动服务时出现了错误。 - DotnetSparrow
@DotnetSparrow:你确定OnStart方法立即返回了吗?服务控制管理器要求服务在合理的时间内响应启动请求。我编辑了我的答案。 - Brian Gideon
@Brain:我刚看到onstart里有System.Threading.Thread.Sleep(10000000);。我已经把它移除了,但是首先我需要停止服务,而且我无法停止它,因为它的状态正在启动中。这是因为这个sleep吗?请建议。 - DotnetSparrow
1
没错。thread.sleep是导致服务无法及时启动的原因。执行sc delete EnviroTracker1...它会被标记为删除。重新启动您的机器。该服务将不复存在。 - Amith George

0
Amith George的回答指出了这个问题的根本原因,但如果你想知道如何调试Windows服务的OnStart方法,我通常会添加以下内容,因为你可能没有足够快的速度手动附加到该服务。
     protected override void OnStart(string[] args)
     {
        if (args.Contains("DEBUG_SERVICE))
            DebugMode();


         #if DEBUG
             DebugMode();
         #endif



        }

    private static void DebugMode()
    {

        Debugger.Break();
    }

Brian Gideon 也提到了一个很好的观点,即需要“启动新线程或以其他方式异步地启动逻辑”。除非您正在响应系统事件或侦听网络端口,否则应考虑使用计时器。我的答案中有一个我用作模板的示例。

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