ServiceController, похоже, не может остановить службу - PullRequest
24 голосов
/ 09 июня 2011

Я пытаюсь остановить службу 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 ]

40 голосов
/ 17 августа 2016

Я знаю, что уже довольно поздно, чтобы ответить на этот вопрос, но я столкнулся с аналогичной проблемой, то есть с ошибкой: "Служба не может принимать управляющие сообщения в это время." и хотел бы добавить это как ссылка для других.

Вы можете попробовать убить этот сервис с помощью 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
13 голосов
/ 11 апреля 2014

Либо ваш сервис занят обработкой какой-либо крупной операции, либо находится в процессе перехода к изменению состояния.следовательно, он больше не может принимать входные данные ... просто думайте, что он принимает больше, чем может прожевать ...

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

6 голосов
/ 21 декабря 2017

У меня была точно такая же проблема с хост-сервисом 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 голос
/ 20 октября 2015

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

1 голос
/ 05 июля 2011

Я также видел эту проблему, особенно когда служба запускается в ожидании, и я посылаю ей программную остановку, которая завершается успешно, но ничего не делает.Также иногда я вижу, что команды останова работающей службы терпят неудачу с тем же исключением, но затем все равно фактически останавливают службу.Я не думаю, что API можно доверять, чтобы делать то, что он говорит.Это объяснение сообщения об ошибке весьма полезно ...

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

0 голосов
/ 29 июля 2011

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

...