安装windows服务

本文关键字:服务 windows 安装 | 更新日期: 2023-09-27 17:58:59

我在ASP.NET 4.0中创建了一个Windows服务,在以管理员身份启动命令提示符后,我将使用以下命令安装该服务:

C: ''Windows''system32>sc create EnviroTracker1 binpath="D:''Freelance Work''SuperExpert''gitEnviroTrack''EnviroTrack''AEnviroTrackerService''bin''Release ''EnviroTrackService.exe"

[SC]创建服务成功

之后,我转到管理员工具->服务,并尝试启动该服务,但我得到了以下错误:

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

服务

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

Windows无法在本地计算机上启动EnviroTracker1服务。

错误1053:服务未响应启动或控制及时提出请求。

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

OK

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

我还尝试了installutil。同样在这种情况下,服务将被安装,其启动类型为自动,服务属性窗口中的服务状态为自动。请给我一个解决方案。

谢谢。

安装windows服务

编辑:正如您在其中一条评论中提到的,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秒,您应该有足够的时间将visualstudio调试器连接到服务实例。

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

您需要一个从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方法中,您可能等待返回的时间过长。您需要确保您只做了足够的工作来启动服务的逻辑。这意味着您可能必须启动一个新线程,或者以某种方式异步启动您的逻辑。

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还提出了一个很好的观点,即需要"启动一个新线程或以其他方式异步启动您的逻辑"。除非您正在响应系统事件或侦听网络端口,否则应考虑为此使用计时器。我的答案有一个样本,我用它作为模板。