【问题标题】:ServiceController seems to be unable to stop a serviceServiceController 似乎无法停止服务
【发布时间】:2011-06-09 12:15:57
【问题描述】:

我正在尝试使用以下代码停止本地计算机上的 Windows 服务(该服务是 Topshelf.Host,如果重要的话):

serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

timeout 设置为 1 小时,但服务实际上从未停止过。奇怪的是,在服务 MMC 管理单元中,我首先看到它处于“停止”状态,但过了一会儿它又恢复为“已启动”。但是,当我尝试手动停止它时,会出现错误:

Windows could not stop the Topshelf.Host service on Local Computer.
Error 1061: The service cannot accept control messages at this time.

我错过了什么吗?

【问题讨论】:

    标签: windows-services servicecontroller


    【解决方案1】:

    我知道我回答这个问题已经很晚了,但我遇到了类似的问题,即错误:“该服务目前无法接受控制消息。”并希望将其添加为供他人参考。

    您可以尝试使用 powershell 终止此服务(以管理员身份运行 powershell):

    #Get the PID of the required service with the help of the service name, say, service name.
    $ServicePID = (get-wmiobject win32_service | where { $_.name -eq 'service name'}).processID 
    
    #Now with this PID, you can kill the service
    taskkill /f /pid $ServicePID
    

    【讨论】:

    • 我无法以管理员身份使用任务管理器终止该服务,并且重新启动也无济于事。这是对我有用的方法。
    • 为我工作。不要忘记以管理员身份运行 powershell。
    • 我使用任务管理器通过服务名称而不是powershell脚本来查找服务进程。
    • @Jackson ... 是的,您可以在任务管理器上找到进程以及进程 ID。但是在某些情况下,关联的服务会卡在停止状态。 powershell 也可以帮助您。如果您获得了卡在启动状态的进程 ID,您可以通过将 $ServicePID 替换为进程 ID 来运行第二个命令。
    • 这对我有用,谢谢!我很想知道为什么我的服务会这样做。每次我想停止我正在测试的服务时,我都不想这样做。我觉得我的服务中很可能存在错误,很高兴知道如何解决这个问题!
    【解决方案2】:

    您的服务要么正忙于处理一些大操作,要么正在转换以更改状态。因此无法接受更多的输入......只是认为它比它可以咀嚼的更多......

    如果你确定你没有给它喂任何大的东西,只需去任务管理器并终止此服务的进程或重新启动你的机器。

    【讨论】:

    • 我刚刚使用任务管理器杀死了该服务。然后我可以再次重新启动服务。谢谢。
    【解决方案3】:

    我在使用 Topshelf 托管服务时遇到了完全相同的问题。原因是服务启动时间长,超过 20 秒。这使服务处于无法处理进一步请求的状态。 只有从命令行(net start my_service)启动服务时,我才能重现问题。

    长星时间Topshelf服务的正确初始化如下:

     namespace Example.My.Service
     {
        using System;
        using System.Threading.Tasks;
    
        using Topshelf;
    
        internal class Program
        {
            public static void Main()
            {
                HostFactory.Run(
                    x =>
                    {
                        x.Service<MyService>(
                            s =>
                            {
                                MyService testServerService = null;
                                s.ConstructUsing(name => testServerService = new MyService());
                                s.WhenStarted(service => service.Start());
                                s.WhenStopped(service => service.Stop());
                                s.AfterStartingService(
                                    context =>
                                    {
                                        if (testServerService == null)
                                        {
                                            throw new InvalidOperationException("Service not created yet.");
                                        }
                                        testServerService.AfterStart(context);
                                    });
                            });
                        x.SetServiceName("my_service");
                    });
            }
        }
    
        public sealed class MyService
        {
            private Task starting;
    
            public void Start()
            {
                this.starting = Task.Run(() => InitializeService());
            }
    
            private void InitializeService()
            {
                // TODO: Provide service initialization code.
            }
    
            [CLSCompliant(false)]
            public void AfterStart(HostControl hostStartedContext)
            {
                if (hostStartedContext == null)
                {
                    throw new ArgumentNullException(nameof(hostStartedContext));
                }
                if (this.starting == null)
                {
                    throw new InvalidOperationException("Service start was not initiated.");
                }
                while (!this.starting.Wait(TimeSpan.FromSeconds(7)))
                {
                    hostStartedContext.RequestAdditionalTime(TimeSpan.FromSeconds(10));
                }
            }
    
            public void Stop()
            {
                // TODO: Provide service shutdown code.
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      我也看到了这个问题,特别是当服务启动挂起时,我以编程方式向它发送停止,它成功但什么也不做。此外,有时我会看到正在运行的服务的停止命令因同样的异常而失败,但实际上仍会停止该服务。我不认为 API 可以按照它所说的去做。这个错误信息解释很有帮助...

      http://technet.microsoft.com/en-us/library/cc962384.aspx

      【讨论】:

        【解决方案5】:

        我遇到了一个类似的问题,发现这是由于其中一项服务陷入了启动挂起、停止挂起或停止的状态。 重新启动服务器或尝试重新启动服务不起作用。 为了解决这个问题,我在服务器中运行任务管理器,在“详细信息”选项卡中,我找到了被卡住的服务,并通过结束任务来终止进程。结束任务后,我能够毫无问题地重新启动服务。

        简而言之: 1.进入任务管理器 2. 点击“详细信息”选项卡 3. 找到您的服务 4.右键单击它并停止/终止该进程。 就是这样。

        【讨论】:

          【解决方案6】:

          我知道它是在不久前打开的,但我有点缺少 Windows 命令提示符的选项,所以只是为了完整起见

          1. 打开任务管理器并找到相应的进程及其 PID,即 PID = 111
            • 最终您可以缩小执行文件的范围,即 Image name = notepad.exe
          2. 在命令提示符下使用命令 TASKKILL
            • 示例:TASKKILL /F /PID 111 ; TASKKILL /F /IM notepad.exe

          【讨论】:

            【解决方案7】:

            在使用 PowerShell(通过 Octopus Deploy)启动和停止服务时,我在内部遇到了这个确切的问题。服务未响应消息的根本原因似乎与开发人员通过 SMB 连接访问根服务安装目录中的文件/文件夹有关(使用记事本/资源管理器查看配置文件)。

            如果服务卡在这种情况下,那么唯一的选择是终止它并使用计算机管理切断连接。之后,服务就可以正常重新部署了。

            可能不是确切的根本原因,但我们现在正在检查。

            【讨论】:

              【解决方案8】:

              我遇到了类似的问题。有时会发生此错误,因为该服务无法再接受控制消息,这可能是由于存在该特定服务的日志文件的服务器中的磁盘空间问题。 如果发生这种情况,您也可以考虑以下选项。

              1. 转到服务 exe 及其日志文件所在的位置。
              2. 释放一些空间
              3. 通过任务管理器杀死服务进程
              4. 启动服务。

              【讨论】:

                【解决方案9】:

                我只是在将代码从旧的多分区盒移动到新的单分区盒时解决了这个问题。在服务停止时,我正在写信给 D:,由于它不再存在,我收到了 1061 错误。不过,在 OnStop 期间的任何长时间操作都会导致此问题,除非您使用回调委托将调用转至另一个线程。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多