Il servizio Windows sul computer locale è stato avviato e quindi interrotto l'errore


105

Di solito ricevo questo errore: (Il servizio "nome servizio" sul computer locale è stato avviato e poi arrestato. Alcuni servizi si interrompono automaticamente se non sono utilizzati da altri servizi o programmi) quando c'è qualcosa che non va nel mio codice, come se non esistesse percorsi di unità, ecc. Il servizio Windows non verrà avviato.

Ho un servizio Windows che esegue il backup di cartelle / file, in una posizione se ha raggiunto il limite di dimensione. I dettagli sono tutti forniti da una configurazione XML che il servizio Windows legge all'avvio. Ho un Windows Form separato che ha un pulsante che fa esattamente ciò che sta facendo onstart il mio servizio Windows. Uso i miei Windows Form per eseguire il debug del codice prima di inserirlo nel mio servizio Windows.

Quando avvio i miei Windows Form. Fa quello che dovrebbe fare. Quando ho inserito il mio codice nel metodo OnStart () del servizio Windows, è stato visualizzato l'errore.

Ecco il mio codice:

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();
        }
    }

Non so cosa impedisce l'avvio del servizio Windows, il simulatore di Windows Form ha funzionato bene. Quello che sembra essere il problema?

AGGIORNAMENTO: Dopo molte prove ho notato che utilizzando solo una directory di cartelle (senza file), il servizio Windows non funziona. Quando ho sostituito la variabile fileWatch con un file specifico (inclusa la sua directory), il servizio Windows è stato avviato. Quando l'ho cambiato di nuovo in una posizione di cartella, non ha funzionato. Quello che penso è che le posizioni delle cartelle non funzionano in un filewatcher.

Quando ho provato a creare un nuovo servizio Windows che controlla la posizione di una cartella, ha funzionato .. Tuttavia, quando ho provato la stessa posizione nel mio servizio Windows originale, non ha funzionato! Ero impazzito $ # * ed! Sembra che devo creare un nuovo servizio Windows e compilare il programma di installazione ogni volta che inserisco un nuovo codice / funzione .. In questo modo posso tenere traccia di dove ricevo un errore.

Risposte:


203

Se il servizio si avvia e si arresta in questo modo, significa che il codice sta generando un'eccezione non gestita. Questo è abbastanza difficile da eseguire il debug, ma ci sono alcune opzioni.

  1. Consulta il Visualizzatore eventi di Windows . Normalmente puoi ottenerlo andando al computer / server manager, quindi facendo clic su Visualizzatore eventi -> Registri di Windows -> Applicazione . Puoi vedere cosa ha generato l'eccezione qui, il che può aiutare, ma non ottieni la traccia dello stack.
  2. Estrai la logica del tuo programma in un progetto di classe di libreria. Ora crea due diverse versioni del programma: un'app console (per il debug) e il servizio Windows. (Questo è un po 'di sforzo iniziale, ma risparmia molta angoscia a lungo termine.)
  3. Aggiungi più blocchi try / catch e accedi all'app per ottenere un'immagine migliore di ciò che sta accadendo.

10
Il Visualizzatore eventi di Windows ha mostrato la traccia completa dello stack, uno strumento molto utile.
Talha Imam

37

Non sono sicuro che sarà utile, ma per il debug di un servizio puoi sempre usare quanto segue nel metodo OnStart:

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

di quanto potresti collegare il tuo studio visivo al processo e avere migliori capacità di debug.

spero che questo sia stato utile, buona fortuna


Questa è di gran lunga la soluzione migliore (almeno per me). VS 2015 gestisce bene anche questo. Per me è spuntata una finestra di dialogo di conferma UAC per il debugger JIT e quindi mi ha permesso di selezionare VS 2015 come debugger.
Smitty

9

Ho trovato molto utile convertire il tuo servizio Windows esistente in una console semplicemente cambiando il tuo programma con quanto segue. Con questa modifica è possibile eseguire il programma eseguendo il debug in Visual Studio o eseguendo normalmente l'eseguibile. Ma funzionerà anche come servizio Windows. Ho anche scritto un post sul blog a riguardo

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
    }
}


2

EventLog.Log dovrebbe essere impostato come "Applicazione"


Ho appena votato in alto perché questa era effettivamente la soluzione al problema per me
Savage

1

Nel frattempo, un altro motivo: l' eliminazione accidentale del file .config ha causato lo stesso messaggio di errore:

"Il servizio sul computer locale è stato avviato e poi interrotto. Alcuni servizi si interrompono automaticamente ..."


0

Usa il timer e seleziona l'evento per copiare i tuoi file.

All'avvio del servizio, avviare l'ora e specificare l'intervallo di tempo.

Quindi il servizio continua a funzionare e copia i file ontick.

Spero che aiuti.


0

Potresti voler eseguire un test unitario dell'inizializzazione, ma poiché è in OnStart metodo questo è quasi impossibile. Suggerirei di spostare il codice di inizializzazione in una classe separata in modo che possa essere testato o almeno riutilizzato in un tester di forma.

In secondo luogo per aggiungere un po 'di registrazione (utilizzando Log4Net o simile) e aggiungere una registrazione dettagliata in modo da poter vedere i dettagli sugli errori di runtime. Esempi di errori di runtime potrebbero essere AccessViolationecc. Soprattutto se il servizio è in esecuzione senza privilegi sufficienti per accedere ai file di configurazione.


0

L'account che esegue il servizio potrebbe non aver mappato l'unità D: (sono specifici dell'utente). Prova a condividere la directory e utilizza il percorso UNC completo nel tuo file backupConfig.

Il tuo watchertipo FileSystemWatcherè una variabile locale ed è fuori ambito quando il OnStartmetodo è terminato . Probabilmente ne avrai bisogno come istanza o variabile di classe.


0

Mi sono imbattuto nello stesso problema. Il mio servizio sta caricando / ricevendo XMLS e scrive gli errori nel registro eventi.

Quando sono andato al registro eventi, ho provato a filtrarlo. Mi viene chiesto che il registro degli eventi fosse danneggiato.

Ho cancellato il registro eventi e tutto OK.


0

Nel nostro caso, non è stato aggiunto nulla nei registri eventi di Windows tranne i registri che il servizio problematico è stato avviato e quindi interrotto.

Risulta che il file CONFIG del servizio non era valido. La correzione del file CONFIG non valido ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.