none
Échec au démarrage d'un Service RRS feed

  • Question

  • Bonjour;

    Je viens vous poser une question car il s'avère que je ne trouve pas de solution réelle a mon problème : j'ai créé un Services (Via Visual Studio) qui démarre 3 threads lors du onStart.

    Les 3 threads sont des boucles; deux sont des boucles d'écoutes TCP la dernière est une tâche s'executant toutes les 10 secondes. Normalement, les thread ne se ferme pas car ils sont dans un "while (true)".

    Le soucis, est que j'obtient ce message (qui apparait instantanément) lorsque je le déplois sur Windows Server 2008 R2 :

    Quand j'ouvre l'observateur d'evenements, voici le log complet que je peux voir : http://befaster.fr/Imgs/Error2.png

    Je tiens a préciser qu'en local (Win7 Pro x64 SP1) le service ne s'execute pas : 

    J'ai suivi à la lettre le "Walkthrough" : http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.100).aspx

    J'utilise bien un installeur, j'ai bien vérifié que les élements créés dans le "ProjectInstaller" ai le même Service Name.

    Je sèche complètement.

    Voici le code onStart de mon service :

                try
                {
                    FirstStartRoutine();
                    TcpServer = new Thread(new ThreadStart(tcpListenerThread));
                    TcpServer.Start();
                    PloofLog.WriteEntry("Ploof Tcp Listening : Started successfully", EventLogEntryType.Information);
                }
                catch (Exception ex)
                {
                    PloofLog.WriteEntry("Ploof Tcp Listening : Not started; StackTrace \n : " + ex.ToString(), EventLogEntryType.Error);
                }
    
                try
                {
                    ThUpdateService = new Thread(new ThreadStart(updateService));
                    ThUpdateService.Start();
                    PloofLog.WriteEntry("Ploof Update Tcp Listening : Started successfully", EventLogEntryType.Information);
                }
                catch (Exception ex)
                {
                    PloofLog.WriteEntry("Ploof Update Tcp Listening : Not started; StackTrace \n : " + ex.ToString(), EventLogEntryType.Error);
                }
    
                try
                {
    
                    DecrementerService = new Thread(new ThreadStart(decrementerThread));
                    DecrementerService.Start();
                    PloofLog.WriteEntry("Ploof DecrementerService : Started successfully", EventLogEntryType.Information);
                }
                catch (Exception ex)
                {
                    PloofLog.WriteEntry("Ploof DecrementerService : Not Started; StackTrace \n : " + ex.ToString(), EventLogEntryType.Error);
                }

    Une idée ?

    Merci d'avance.





    • Modifié Bahaika samedi 18 février 2012 16:23
    samedi 18 février 2012 15:50

Réponses

  • Bonjour Bahaika,

    Pour résoudre votre problème, il faut que vous déboguiez votre service Windows.

    Pour déboguer votre service Windows, il y a deux options:

    1. Attacher le processus du service via Visual Studio. Voici la procédure.
    2. Ajouter une option pour permettre au service d'être démarré en ligne de commande. Pour ce faire, ajoutez l'argument debug dans la section "Options de démarrage" (propriétés du projet/ onglet Déboguer). Puis dans la méthode Main de la classe Program.cs, vous devez récupérer cet argument et démarrer le service:

    Program.cs:

        internal static class Program
        {
            #region Static Methods
    
            private static void Main(string[] args)
            {
                // Le nom de votre service Windows
                var windowsService = new windowsService();
    
                if (args.Length > 0 && args[0] == "debug")
                {
                    windowsService.Run(args);
                    while (true)
                    {
                        Thread.Sleep(500); // vous pouvez rendre le timeout paramètrable
                    }
                }
    
                ServiceBase.Run(new[] { windowsService });
            }
    
            #endregion
        }


    La méthode Run:

            public void Run(string[] args)
            {
                OnStart(args);
            }

    Cordialement,


    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    samedi 18 février 2012 23:33
    Auteur de réponse
  • Bonjour,

    On peut également ajouter la ligne System.Diagnostics.Debugger.Launch() dans le OnStart() pour lancer la fenêtre de debug et lier l'instance de visual studio qui a ouvert la solution du service.

    mercredi 22 février 2012 23:28

Toutes les réponses

  • Bonjour,

    Est-ce que la version de compilation a été faite en 64 bits ?

    Quelle est la version de framework du serveur ?

    Est-ce que le service démarre avec le compte System ou autre ?


    fred on youTube
    PHP MySQL Web Site Creator
    fred


    • Modifié fred75 samedi 18 février 2012 17:13
    samedi 18 février 2012 17:12
  • Non, je n'ai pas précisé de paramètre d'architecture; aurais-je du ?

    Le framework est le 4.0 Client Profile.

    Je démarre avec le compte "LocalService" (Paramètre dans le ServiceProcessInstaller, c'est bien ça ?).

    samedi 18 février 2012 17:24
  • Bonjour,

    oui il faut un maximum de renseignements afin que l'on puisse voir une anomalie plus facilement.

    as-tu compiler ton projet en 64 bits sachant qu'un serveur 2008 R2 est nativement en 64bits ?


    fred on youTube
    PHP MySQL Web Site Creator
    fred

    samedi 18 février 2012 22:39
  • Bonjour Bahaika,

    Pour résoudre votre problème, il faut que vous déboguiez votre service Windows.

    Pour déboguer votre service Windows, il y a deux options:

    1. Attacher le processus du service via Visual Studio. Voici la procédure.
    2. Ajouter une option pour permettre au service d'être démarré en ligne de commande. Pour ce faire, ajoutez l'argument debug dans la section "Options de démarrage" (propriétés du projet/ onglet Déboguer). Puis dans la méthode Main de la classe Program.cs, vous devez récupérer cet argument et démarrer le service:

    Program.cs:

        internal static class Program
        {
            #region Static Methods
    
            private static void Main(string[] args)
            {
                // Le nom de votre service Windows
                var windowsService = new windowsService();
    
                if (args.Length > 0 && args[0] == "debug")
                {
                    windowsService.Run(args);
                    while (true)
                    {
                        Thread.Sleep(500); // vous pouvez rendre le timeout paramètrable
                    }
                }
    
                ServiceBase.Run(new[] { windowsService });
            }
    
            #endregion
        }


    La méthode Run:

            public void Run(string[] args)
            {
                OnStart(args);
            }

    Cordialement,


    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    samedi 18 février 2012 23:33
    Auteur de réponse
  •  

    Bonjour, Bahaika,

    Est-ce que vous avez réussi à déboguer votre Service ? Merci de tenir la communauté informée sur la suite de vos démarches.

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 21 février 2012 09:06
  • Bonjour,

    On peut également ajouter la ligne System.Diagnostics.Debugger.Launch() dans le OnStart() pour lancer la fenêtre de debug et lier l'instance de visual studio qui a ouvert la solution du service.

    mercredi 22 février 2012 23:28