112 votes

Erreur : le service Windows de l'ordinateur local a démarré puis s'est arrêté

En général, j'obtiens cette erreur : (Le service "nom du service" de l'ordinateur local a démarré puis s'est arrêté. Certains services s'arrêtent automatiquement s'ils ne sont pas utilisés par d'autres services ou programmes) lorsqu'il y a un problème avec mon code, comme des chemins d'accès inexistants, etc. Le service Windows ne démarre pas.

J'ai un service Windows qui sauvegarde les dossiers/fichiers, vers un emplacement s'il a atteint la limite de taille. Tous les détails sont fournis par une configuration XML que le service Windows lit au démarrage. J'ai un formulaire Windows séparé qui contient un bouton qui fait exactement ce que fait le service Windows au démarrage. J'utilise mes formulaires Windows pour déboguer le code avant de le mettre dans mon service Windows.

Lorsque je lance mes formulaires Windows. Il fait ce qu'il est censé faire. Quand j'ai mis mon code dans la méthode OnStart() du service Windows, l'erreur est apparue.

Voici mon code :

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";

    protected override void OnStart(string[] args)
    {
        if (File.Exists(backupConfig))
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            XmlTextReader reader = new XmlTextReader(backupConfig);

            XmlNodeType type;
            List<string> listFile = new List<string>();
            string fileWatch = "";

            //this loop is for reading XML elements and assigning to variables
            while (reader.Read())
            {
                type = reader.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader.Name == "File")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                    else if (reader.Name == "Folder")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                }
            }
            reader.Close();

            watcher.Path = fileWatch;
            watcher.Filter = "*.*";

            //this loop reads whether the service will watch a file/folder
            XmlTextReader reader1 = new XmlTextReader(backupConfig);
            while (reader1.Read())
            {
                type = reader1.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader1.Name == "File")
                    {
                        watcher.IncludeSubdirectories = false;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFile);
                    }
                    else if (reader1.Name == "Folder")
                    {
                        watcher.IncludeSubdirectories = true;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
                    }
                }
            }
            reader1.Close();

            watcher.EnableRaisingEvents = true;

        }
        else
        {
            StreamWriter sw = new StreamWriter(serviceStat, true);
            sw.WriteLine("File not found. Please start the Log Backup UI first.");
            sw.Close();
        }
    }

Je ne sais pas ce qui fait que le service Windows ne démarre pas, le simulateur de formulaire Windows fonctionnait bien. Quel semble être le problème ?

MISE À JOUR : Après de nombreux essais, j'ai remarqué qu'en utilisant uniquement un répertoire de dossiers (sans fichier), le service Windows ne fonctionne pas. Lorsque j'ai remplacé la variable fileWatch par un fichier spécifique (y compris son répertoire), le service Windows a démarré. Lorsque j'ai remplacé la variable par un emplacement de dossier, il n'a pas fonctionné. Ce que je pense, c'est que l'emplacement des dossiers ne fonctionne pas dans un filewatcher.

Lorsque j'ai essayé de créer un nouveau service Windows qui surveille un emplacement de dossier, cela a fonctionné . Cependant, lorsque j'ai essayé le même emplacement dans mon service Windows original, cela n'a pas fonctionné ! Je n'en revenais pas ! Il semble que je doive créer un nouveau service Windows et construire l'installateur chaque fois que je place un nouveau code/fonction De cette façon, je peux garder la trace des endroits où j'obtiens une erreur.

214voto

McGarnagle Points 56802

Si le service démarre et s'arrête comme ça, cela signifie que votre code lance une exception non gérée. C'est assez difficile à déboguer, mais il y a quelques options.

  1. Consultez le site de Windows Visualisateur d'événements . Normalement, vous pouvez y accéder en allant dans le gestionnaire d'ordinateur/serveur, puis en cliquant sur Visualisateur d'événements -> Journaux de Windows -> Application . Vous pouvez voir ce qui a déclenché l'exception ici, ce qui peut vous aider, mais vous n'obtenez pas la trace de la pile.
  2. Extrayez la logique de votre programme dans un projet de classe de bibliothèque. Créez maintenant deux versions différentes du programme : une application console (pour le débogage) et le service Windows. (C'est un peu d'effort initial, mais cela évite beaucoup d'angoisse à long terme).
  3. Ajoutez plus de blocs try/catch et de journalisation à l'application pour avoir une meilleure idée de ce qui se passe.

12 votes

L'observateur d'événements de Windows a montré la trace complète de la pile, un outil très utile.

0 votes

Merci beaucoup. J'ai récemment désinstallé JRE et je n'ai pas pu redémarrer le service Jenkins car il pointait vers le répertoire bin de JRE supprimé. J'ai dû configurer un nouveau chemin dans jenkins.xml 's executable étiquette. J'ai trouvé cette réponse très utile ! +1.

37voto

Eyal H Points 436

Je ne suis pas sûr que cela soit utile, mais pour déboguer un service, vous pouvez toujours utiliser la méthode suivante dans la méthode OnStart :

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

que vous pourriez attacher votre studio visuel au processus et avoir de meilleures capacités de débogage.

J'espère que cela vous a été utile, bonne chance

0 votes

C'est de loin la meilleure solution (du moins pour moi). VS 2015 gère également cette solution de manière très efficace. Pour moi, il a fait apparaître une boîte de dialogue de confirmation UAC pour le débogueur JIT et m'a ensuite laissé sélectionner VS 2015 comme débogueur.

9voto

Ben Anderson Points 1454

J'ai trouvé qu'il était très pratique de convertir vos fichiers existants Service Windows à un console en changeant simplement votre programme avec le suivant. Avec ce changement, vous pouvez exécuter le programme en déboguant dans Visual Studio ou en exécutant l'exécutable normalement. Mais il fonctionnera également comme un service Windows. J'ai également publié un article sur mon blog à ce sujet

program.cs

class Program
{
    static void Main()
    {
        var program = new YOUR_PROGRAM();
        if (Environment.UserInteractive)
        {
            program.Start();
        }
        else
        {
            ServiceBase.Run(new ServiceBase[]
            {
                program
            });
        }
    }
}

VOTRE_PROGRAMME.cs

[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
    public YOUR_PROGRAM()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Start();
    }

    protected override void OnStop()
    {
        //Stop Logic Here
    }

    public void Start()
    {
        //Start Logic here
    }
}

4voto

shah Points 5

Veuillez vérifier que vous avez enregistré tous les points d'accès HTTP dans la liste de contrôle d'accès (ACL) de la mahcine locale.

http://just2thepoint.blogspot.fr/2013/10/Windows-service-on-local-computer.html

0voto

PanosPlat Points 118

J'ai rencontré le même problème. Mon service télécharge/reçoit des XMLS et écrit les erreurs dans le journal des événements.

Quand je suis allé dans le journal des événements, j'ai essayé de le filtrer. Le système m'a indiqué que le journal des événements était corrompu.

J'ai effacé le journal des événements et tout est OK.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X