31

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

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.

我在这里错过了什么吗?

4

9 回答 9

62

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

您可以尝试使用 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
于 2016-08-17T14:38:12.357 回答
14

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

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

于 2014-04-11T10:31:35.440 回答
6

我对 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.
        }
    }
}
于 2017-12-21T10:22:11.793 回答
2

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

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

于 2011-07-05T16:38:47.913 回答
2

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

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

于 2020-06-15T20:08:18.807 回答
1

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

  1. 转到服务 exe 及其日志文件所在的位置。
  2. 腾出一些空间
  3. 通过任务管理器杀死服务的进程
  4. 启动服务。
于 2015-10-20T07:31:58.290 回答
1

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

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

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

如果服务卡在这种情况下,那么唯一的选择是终止它并使用计算机管理切断连接。之后,服务能够很好地重新部署。

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

于 2020-10-08T13:12:57.717 回答
0

I just fought this problem while moving code from an old multi partition box to a newer single partition box. On service stop I was writing to D: and since it didn't exist anymore I got a 1061 error. Any long operation during the OnStop will cause this though unless you spin the call off to another thread with a callback delegate.

于 2011-07-29T19:54:29.210 回答