ServiceController, похоже, не может остановить службу
Я пытаюсь остановить службу Windows на локальном компьютере (служба Topshelf.Host
, если это имеет значение) с этим кодом:
serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
timeout
установлен на 1 час, но сервис никогда не останавливается. Странно то, что из оснастки MMC Services сначала я вижу ее в состоянии "Остановка", но через некоторое время она возвращается к "Запущено". Однако, когда я пытаюсь остановить его вручную, возникает ошибка:
Windows could not stop the Topshelf.Host service on Local Computer.
Error 1061: The service cannot accept control messages at this time.
Я что-то здесь упускаю?
6 ответов
Я знаю, что уже довольно поздно, чтобы ответить на этот вопрос, но я столкнулся с аналогичной проблемой, то есть с ошибкой: "Служба не может принимать управляющие сообщения в это время". и хотел бы добавить это как ссылку для других.
Вы можете попробовать убить этот сервис с помощью 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
Либо ваш сервис занят обработкой какой-либо большой операции, либо находится в процессе перехода к изменению состояния. следовательно, он больше не может принимать входные данные... просто думайте, что он принимает больше, чем может прожевать...
если вы уверены, что ничего не выделили, просто зайдите в диспетчер задач и завершите процесс для этой службы или перезапустите компьютер.
У меня была точно такая же проблема с сервисом 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.
}
}
}
Я столкнулся с аналогичной проблемой и выяснил, что это произошло из-за того, что одна из служб застряла в состоянии ожидания запуска, ожидания остановки или остановки. Перезагрузка сервера или попытка перезапуска служб не помогли. Чтобы решить эту проблему, я запускаю диспетчер задач на сервере и на вкладке "Подробности" обнаружил службы, которые зависли, и убил процесс, завершив задачу. После завершения задачи я смог без проблем перезапустить службы.
Вкратце: 1. Перейдите в диспетчер задач 2. Щелкните вкладку "Подробности" 3. Найдите службу 4. Щелкните ее правой кнопкой мыши и остановите / завершите процесс. Вот и все.
Я также видел эту проблему, особенно когда служба запускается в ожидании, и я посылаю ей программную остановку, которая завершается успешно, но ничего не делает. Также иногда я вижу, что команды остановки работающей службы завершаются сбоем с тем же исключением, но затем все равно фактически останавливают службу. Я не думаю, что API можно доверять, чтобы делать то, что он говорит. Это объяснение сообщения об ошибке весьма полезно...
Я знаю, что он был открыт некоторое время назад, но мне немного не хватает опции в командной строке Windows, поэтому только для полноты картины
- Откройте диспетчер задач и найдите соответствующий процесс и его PID, т.е. PID = 111
- В конце концов вы можете сузить исполнительный файл, т. Е. Image name = notepad.exe
- в командной строке используйте команду TASKKILL
- пример: TASKKILL /F /PID 111; TASKKILL /F /IM notepad.exe
У меня была именно эта проблема внутри при запуске и остановке службы с помощью PowerShell (через Octopus Deploy). Основная причина того, что служба не отвечает на сообщения, по-видимому, связана с тем, что разработчики получают доступ к файлам / папкам в корневом каталоге установки службы через соединение SMB (просматривая файл конфигурации с помощью блокнота / проводника).
Если служба застревает в этой ситуации, единственный вариант - убить ее и разорвать соединения с помощью управления компьютером. После этого сервис смогли нормально перераспределить.
Возможно, это не точная первопричина, но мы сейчас проверяем это.
Я сталкивался с подобной проблемой. Эта ошибка иногда возникает из-за того, что служба больше не может принимать управляющие сообщения, это может быть связано с проблемами дискового пространства на сервере, где присутствует файл журнала этой конкретной службы. Если это произойдет, вы можете рассмотреть вариант ниже. 1. Перейдите в папку, где находится exe-файл сервиса и его файл журнала. 2. Освободите место. 3. Завершите процесс служб с помощью диспетчера задач. 4. Запустите службу.
Я только что боролся с этой проблемой при перемещении кода из старого многораздельного блока в более новый однораздельный блок. На остановке сервиса я писал в D: и так как он больше не существовал, я получил ошибку 1061. Любая длительная операция во время OnStop вызовет это, если только вы не отключите вызов другому потоку с делегатом обратного вызова.