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 можно доверять, чтобы делать то, что он говорит. Это объяснение сообщения об ошибке весьма полезно...

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

Я знаю, что он был открыт некоторое время назад, но мне немного не хватает опции в командной строке Windows, поэтому только для полноты картины

  1. Откройте диспетчер задач и найдите соответствующий процесс и его PID, т.е. PID = 111
    • В конце концов вы можете сузить исполнительный файл, т. Е. Image name = notepad.exe
  2. в командной строке используйте команду TASKKILL
    • пример: TASKKILL /F /PID 111; TASKKILL /F /IM notepad.exe

У меня была именно эта проблема внутри при запуске и остановке службы с помощью PowerShell (через Octopus Deploy). Основная причина того, что служба не отвечает на сообщения, по-видимому, связана с тем, что разработчики получают доступ к файлам / папкам в корневом каталоге установки службы через соединение SMB (просматривая файл конфигурации с помощью блокнота / проводника).

Если служба застревает в этой ситуации, единственный вариант - убить ее и разорвать соединения с помощью управления компьютером. После этого сервис смогли нормально перераспределить.

Возможно, это не точная первопричина, но мы сейчас проверяем это.

Я сталкивался с подобной проблемой. Эта ошибка иногда возникает из-за того, что служба больше не может принимать управляющие сообщения, это может быть связано с проблемами дискового пространства на сервере, где присутствует файл журнала этой конкретной службы. Если это произойдет, вы можете рассмотреть вариант ниже. 1. Перейдите в папку, где находится exe-файл сервиса и его файл журнала. 2. Освободите место. 3. Завершите процесс служб с помощью диспетчера задач. 4. Запустите службу.

Я только что боролся с этой проблемой при перемещении кода из старого многораздельного блока в более новый однораздельный блок. На остановке сервиса я писал в D: и так как он больше не существовал, я получил ошибку 1061. Любая длительная операция во время OnStop вызовет это, если только вы не отключите вызов другому потоку с делегатом обратного вызова.

Другие вопросы по тегам