我正在尝试使用此代码停止本地计算机上的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.
我在这里错过了什么吗?
答案 0 :(得分:39)
我知道我回答这个问题已经很晚了但是我遇到了类似的问题,即错误:“此时服务无法接受控制消息。”并希望将其添加为别人的参考。
您可以尝试使用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
答案 1 :(得分:12)
您的服务正忙于处理某些大型操作或正在转换以更改状态。因此无法接受任何输入...只是认为它比它能咀嚼更多......
如果您确定没有为它提供任何重要信息,只需转到任务管理器并终止此服务的过程或重新启动您的计算机。
答案 2 :(得分: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.
}
}
}
答案 3 :(得分:2)
我遇到了类似的问题,发现这是由于其中一项服务陷入了开始挂起,停止挂起或停止的状态。 重新启动服务器或尝试重新启动服务均无效。 为了解决这个问题,我在服务器中运行任务管理器,并在“详细信息”选项卡中找到了被卡住的服务,并通过结束任务杀死了该服务。结束任务后,我能够毫无问题地重启服务。
简而言之: 1.转到任务管理器 2.单击“详细信息”选项卡 3.找到您的服务 4.右键单击它并停止/终止该过程。 就是这样。
答案 4 :(得分:1)
我也看到了这个问题,特别是当服务开始挂起时,我以编程方式发送一个成功但没有做任何事情的停止。另外,有时我看到对正在运行的服务的停止命令失败并出现同样的异常,但实际上仍然停止了服务。我不认为API可以信任它所说的。此错误消息说明非常有用......
答案 5 :(得分:1)
我遇到了类似的问题。此错误有时会发生,因为服务无法再接受控制消息,这可能是由于服务器中存在特定服务的日志文件的磁盘空间问题。 如果发生这种情况,您也可以考虑以下选项。 1.前往服务地点和服务地点它的日志文件位于。 2.放松一些空间 3.通过任务管理器终止服务的流程 4.开始服务。
答案 6 :(得分:1)
使用PowerShell(通过Octopus Deploy)启动和停止服务时,我在内部遇到此确切问题。服务未响应消息的根本原因似乎与开发人员通过SMB连接访问根服务安装目录中的文件/文件夹有关(使用记事本/浏览器查看配置文件)。
如果该服务陷入这种情况,则唯一的选择是终止该服务并使用计算机管理来切断连接。之后,可以重新部署服务。
可能不是确切的根本原因,但我们现在要检查。
答案 7 :(得分:0)
我在将代码从旧的多分区框移动到较新的单个分区框时解决了这个问题。在服务停止时我写信给D:因为它不再存在我得到1061错误。 OnStop期间的任何长时间操作都会导致这种情况,除非您将调用旋转到具有回调委托的另一个线程。
答案 8 :(得分:0)
我知道它是在不久前打开的,但是我有点缺少Windows命令提示符下的选项,所以仅出于完整性考虑