web-dev-qa-db-fra.com

ServiceController semble être incapable d'arrêter un service

J'essaie d'arrêter un service Windows sur une machine locale (le service est Topshelf.Host, si cela compte) avec ce code:

serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

timeout est défini sur 1 heure, mais le service n'est jamais arrêté. Ce qui est étrange avec cela, c’est que, dans le composant logiciel enfichable Services MMC, je le vois tout d’abord en état "Arrêt", puis qu’il redevient "Démarré" après un certain temps. Cependant, lorsque j'essaie de l'arrêter manuellement, une erreur se produit: 

Windows could not stop the Topshelf.Host service on Local Computer.
Error 1061: The service cannot accept control messages at this time.

Est-ce que j'ai râté quelque chose?

19
Anton Gogolev

Je sais que je suis assez en retard pour répondre à cette question, mais j’ai rencontré un problème similaire, c’est-à-dire l’erreur: "Le service ne peut pas accepter les messages de contrôle pour le moment". et voudrait ajouter ceci comme référence pour d’autres.

Vous pouvez essayer de supprimer ce service en utilisant PowerShell (exécutez PowerShell en tant qu'administrateur):

#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
36
Rishi

Votre service est occupé à traiter une opération importante ou est en train de changer d'état. par conséquent, il n’est plus en mesure d’accepter d’entrée ... pensez-y simplement comme prenant plus qu’il ne peut en mâcher ...

si vous êtes certain de ne rien avoir ajouté à rien, accédez au gestionnaire de tâches et arrêtez le processus pour ce service ou redémarrez votre ordinateur.

12
Niranjan Malviya

J'ai eu exactement le même problème avec le service hébergé Topshelf. La cause était longue heure de début de service, plus de 20 secondes. Ce service a laissé le service dans l'état où il n'a pas été en mesure de traiter d'autres demandes .. J'ai pu reproduire le problème uniquement lorsque le service a été démarré à partir d'une ligne de commande (net start my_service).

Une initialisation correcte pour le service Topshelf avec un temps d'étoile long est la suivante:

 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.
        }
    }
}
6
blaz

J'ai également constaté ce problème, notamment lorsqu'un service est en attente de démarrage et que je lui envoie un arrêt par programme qui réussit mais ne fait rien. De plus, parfois, des commandes d'arrêt adressées à un service en cours échouent avec la même exception, mais arrêtent toujours le service. Je ne pense pas qu'on puisse faire confiance à l'API pour faire ce qu'elle dit. Cette explication de message d'erreur est très utile ...

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

1
jtruelove

J'ai rencontré le même problème. Cette erreur se produit parfois car le service ne peut plus accepter les messages de contrôle. Cela peut être dû à des problèmes d'espace disque sur le serveur où le fichier journal de ce service est présent . Si cela se produit, vous pouvez envisager l'option ci-dessous également . 1. Allez à l'emplacement où se trouve l'exe de service et son fichier journal . 2. Libérez de l'espace 3. Tuez le processus des services via le Gestionnaire de tâches 4.Démarrez le service.

1
user5465995

Je viens de lutter contre ce problème lors du déplacement du code d'une ancienne boîte à partitions multiples vers une nouvelle boîte à partitions uniques. À l’arrêt du service, j’écrivais à D: et comme il n’existait plus, j’ai reçu une erreur 1061. Toutefois, toute opération de longue durée au cours de l'opération OnStop entraînera cette perte, à moins que vous ne dévidiez de l'appel vers un autre thread avec un délégué de rappel.

0
TWood