Служба 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, поэтому только для полноты

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