Служба ServiceController, похоже, не может остановить службу
Я пытаюсь остановить службу 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.
Я что-то пропустил?
Ответы
Ответ 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
Ответ 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. Вернитесь туда, где находится служба exe и файл журнала.
2. Освободите место
3. Завершите процесс обслуживания через диспетчер задач
4. Запустите службу.
Ответ 6
Я просто боролся с этой проблемой, перемещая код из старого многораздельного окна в более новый отдельный раздел. На остановке обслуживания я писал D: и поскольку он больше не существовал, я получил ошибку 1061. Любая длительная операция во время OnStop приведет к этому, но если вы не открутите вызов до другого потока с делегатом обратного вызова.
Ответ 7
Enfrento isso diariamente comum serviço que em alguns servidores ele simplesmente fica neste estado de erro. Como são servidores de produção eu utilizo o CMD para pará -lo.
1- ABRA O CMD COMO ADMINISTRADOR.
2- DIGITE "SC QUERYEX (NOME DO SERVIÇO)" SEM ASPAS. EXEMPLO: SC QUERYEX SERVICE
3- IRÁ APARECER AS INFORMAÇÕES DO SERVIÇO, MAS O QUE QUEREMOS É O PID (ИДЕНТИФИКАЦИЯ DO PROCESSO).
4- DIGITE "TASKKILL/PID (NÚMERO DO PID)/F" ПРИМЕР: TASKKILL/PID 25645/F
O/F É PARA FORÇAR A PARADA.
5- EM SEGUIDA VOCÊ PODE DESINSTALAR O SERVIÇO OU SIMPLESMENTE INICIÁ -lo.
Сложности и проблемы, с которыми я сталкиваюсь, не могут быть предоставлены Microsoft в течение последних лет, а также в NetFramework porcamente.
:)
Ответ 8
Я знаю, что он был открыт некоторое время назад, но мне не хватает опции в командной строке Windows, поэтому только для полноты
- Откройте диспетчер задач и найдите соответствующий процесс и его PID, т.е. PID = 111
- В конце концов, вы можете сузить исполнительный файл, т.е. Image name = notepad.exe
- в командной строке используйте команду TASKKILL
- пример: TASKKILL/F/PID 111; TASKKILL/F/IM notepad.exe