web-dev-qa-db-fra.com

Le service Windows sur l'ordinateur local a démarré puis s'est arrêté erreur

En général, le message d'erreur suivant s'affiche: .__ (le service "nom du service" sur l'ordinateur local a été démarré puis arrêté. Certains services s'arrêtent automatiquement s'ils ne sont pas utilisés par un autre service ou programme) lorsqu'il y a un problème avec mon code, comme chemins de lecteurs non existants, etc. Le service Windows ne démarrera pas.

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

Quand je commence mes formulaires Windows. Il fait ce qu'il suppose de faire. Lorsque 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 empêche le service Windows de démarrer, le simulateur de formulaire Windows a bien fonctionné. Quel semble être le problème?

UPDATE: Après de nombreux essais, j'ai remarqué qu'en utilisant uniquement un répertoire de dossiers (fichier sans sortie), le service Windows ne fonctionnait 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 je l'ai reconverti dans un dossier, cela ne fonctionnait pas. Ce que je pense, c'est que l'emplacement des dossiers ne fonctionne pas dans un gestionnaire de fichiers.

Lorsque j'ai essayé de créer un nouveau service Windows surveillant l'emplacement d'un dossier, cela a fonctionné. Cependant, lorsque j'ai essayé le même emplacement dans mon service Windows d'origine, cela n'a pas fonctionné! J'avais l'esprit # $ ed! Il semble que je doive créer un nouveau service Windows et construire l'installateur chaque fois que je place un nouveau code/une nouvelle fonction. De cette façon, je peux garder une trace de l'endroit où j'obtiens une erreur.

88
Blackator

Si le service démarre et s’arrête de cette façon, cela signifie que votre code génère une exception non gérée. C'est assez difficile à déboguer, mais il y a quelques options.

  1. Consultez Windows Observateur d'événements . Normalement, vous pouvez y accéder en accédant au gestionnaire de l'ordinateur/du serveur, puis en cliquant sur Observateur d'événements -> Journaux Windows -> Application . Vous pouvez voir ce qui a jeté l'exception ici, ce qui peut 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. (Ceci est un peu d'effort initial, mais sauve beaucoup d'angoisse à long terme.)
  3. Ajoutez plus de blocs try/catch et de connexion à l'application pour obtenir une meilleure image de ce qui se passe.
175
McGarnagle

Pas sûr que cela soit utile, mais pour déboguer un service, vous pouvez toujours utiliser les éléments suivants 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.

espérons que cela a été utile, bonne chance

32
Eyal H

J'ai trouvé très pratique de convertir votre service Windows existant en une console en modifiant simplement votre programme avec les éléments suivants. Avec cette modification, vous pouvez exécuter le programme en effectuant un débogage dans Visual Studio ou en exécutant l’exécutable normalement. Mais cela fonctionnera aussi comme un service Windows. _ { J'ai aussi publié un article sur ce blog

program.cs

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

YOUR_PROGRAM.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
    }
}
9
Ben Anderson

Vérifiez que vous avez bien enregistré tous les points de terminaison HTTP dans la liste de contrôle d'accès (ACL) du mahcine local.

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

3
shah

EventLog.Log doit être défini comme "Application"

1
panini pitke

Dans notre cas, rien n'a été ajouté dans les journaux des événements Windows, à l'exception des journaux indiquant que le service problématique a été démarré puis arrêté.

Il s'avère que le fichier CONFIG du service n'était pas valide. La correction du fichier CONFIG non valide a résolu le problème.

0
rikitikitik

Utilisez Minuterie et cochez événement pour copier vos fichiers.

Au démarrage du service, démarrez l'heure et spécifiez l'intervalle dans l'heure.

Le service continue donc à fonctionner et copie les fichiers ontick.

J'espère que ça vous aidera.

0
Sethu

En attendant, une autre raison: a supprimé accidentellement le fichier .config car le même message d'erreur apparaît: 

"Le service sur l'ordinateur local a démarré puis s'est arrêté. Certains services s'arrêtent automatiquement ..."

0
Emre Guldogan

Je suis tombé sur le même problème. Mon service télécharge/reçoit XMLS et écrit les erreurs dans le journal des événements.

Lorsque je suis allé au journal des événements, j'ai essayé de le filtrer. Cela me dit que le journal des événements a été corrompu.

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

0
PanosPlat

Vous voudrez peut-être tester un peu l'initialisation, mais comme c'est dans la méthode OnStart, c'est presque impossible. Je suggérerais de déplacer le code d'initialisation dans une classe distincte afin qu'il puisse être testé ou au moins réutilisé dans un testeur de formulaire.

Deuxièmement, ajoutez une journalisation (à l’aide de Log4Net ou similaire) et ajoutez une journalisation détaillée pour que vous puissiez voir les détails des erreurs d’exécution. AccessViolation etc. est un exemple d'erreur d'exécution, en particulier si votre service fonctionne sans suffisamment de privilèges pour accéder aux fichiers de configuration.

0
Quinton Bernhardt

Le compte qui exécute le service n'a peut-être pas mappé le D: -drive (ils sont spécifiques à l'utilisateur). Essayez de partager le répertoire et utilisez le chemin UNC complet dans votre backupConfig.

Votre watcher de type FileSystemWatcher est une variable locale et sort de la portée lorsque la méthode OnStart est terminée. Vous en aurez probablement besoin comme variable d'instance ou de classe.

0
Alf Kåre Lefdal