Служба Windows на локальному комп’ютері почалася, а потім зупинилася помилка


104

Зазвичай я отримую цю помилку: (Служба "Ім'я служби" на локальному комп’ютері запускається і потім припиняється. Деякі служби припиняються автоматично, якщо інша служба або програми не використовуються), коли в моєму коді щось не так, наприклад, не існує доріжки та ін. Служба Windows не запуститься.

У мене є служба Windows, яка створює резервну копію папок / файлів до місця, якщо вона досягла обмеження розміру. Детальну інформацію надає Конфігурація XML, яку служба Windows читає при запуску. У мене є окремі форми Windows, у яких є кнопка, яка робить саме те, що робить моя служба Windows. Я використовую свої форми Windows для налагодження коду, перш ніж помістити його в службу Windows.

Коли я запускаю вікна форми. Це робить те, що він повинен робити. Коли я поміщав свій код у метод Windows Service OnStart (), виявилася помилка.

Ось мій код:

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

Я не знаю, що змушує сервіс Windows не запускатися, симулятор форми Windows працював чудово. У чому здається проблема?

ОНОВЛЕННЯ: Після багатьох випробувань я помітив, що, використовуючи лише каталог папок (без файлу / виводу), служба Windows не працює. Коли я замінив змінну fileWatch конкретним файлом (включаючи його каталог), служба Windows почалася. Коли я повернув його до місця папки, він не працював. Я думаю, що розташування папок не працює у програмі перегляду файлів.

Коли я спробував створити нову службу Windows, яка дивиться місце розташування папок, вона працювала. Однак, коли я спробував те саме місце у своєму початковому сервісі Windows, це не вийшло! Я був mindf $ # * ed! Здається, що мені потрібно створити нову службу Windows та створити інсталятор щоразу, коли я розміщую новий код / ​​функцію. Таким чином я можу відстежувати, де я отримую помилку.

Відповіді:


202

Якщо служба запускається і припиняється таким чином, це означає, що ваш код кидає необроблений виняток. Це досить складно налагодити, але є кілька варіантів.

  1. Зверніться до програми перегляду подій Windows . Як правило, ви можете дістатись до цього, перейшовши до менеджера комп’ютерів / серверів, потім клацніть Переглядач подій -> Журнали Windows -> Програма . Ви можете бачити, що тут викинуло виняток, що може допомогти, але сліду стека ви не отримаєте.
  2. Витягніть свою логіку програми в проект бібліотечного класу. Тепер створіть дві різні версії програми: консольний додаток (для налагодження) та сервіс Windows. (Це трохи початкових зусиль, але в перспективі економить багато гніву.)
  3. Додайте більше блоків спробу / лову та реєстрації в додатку, щоб краще уявити, що відбувається.

10
Переглядач подій Windows показав повний слід стека, дуже корисний інструмент.
Ілам Талха

37

Не впевнений, що це буде корисно, але для налагодження послуги ви завжди можете використовувати наступне у методі OnStart:

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

ніж ви могли б приєднати свою візуальну студію до процесу та мати кращі можливості налагодження.

сподіваюся, що це було корисно, удачі


Це, безумовно, найкраще рішення (принаймні для мене). VS 2015 також добре справляється з цим. Для мене він вискочив діалогове вікно підтвердження UAC для налагоджувача JIT, а потім дозволить мені вибрати VS 2015 як налагоджувач.
Smitty

9

Я вважаю дуже зручним перетворити існуючий сервіс Windows на консоль , просто змінивши програму на наступне. За допомогою цієї зміни ви можете запустити програму, налагодивши програму у візуальній студії або запустивши виконуваний файл у звичайному режимі. Але він також буде працювати як сервіс Windows. Я також зробив про це в блозі

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 слід встановити як "Application"


Я щойно підтримав рішення, оскільки це насправді було вирішення проблеми для мене
Savage

1

Тим часом, з’являється ще одна причина: випадково видалений файл .config викликав те саме повідомлення про помилку:

"Сервіс на локальному комп'ютері розпочався, а потім припинився. Деякі служби припиняються автоматично ..."


0

Використовуйте таймер і позначте подію для копіювання файлів.

Після запуску послуги розпочніть час та вкажіть інтервал у часі.

Таким чином, служба продовжує працювати та копіювати файли натхненно.

Сподіваюся, це допоможе.


0

Ви можете спробувати перевірити ініціалізацію, але оскільки це в OnStartметоді, це майже неможливо. Я б запропонував перемістити код ініціалізації в окремий клас, щоб його можна було протестувати або принаймні повторно використовувати у тестері форм.

По-друге, додати деякі журнали (за допомогою Log4Net або подібних) та додати деякі багатослівні журнали, щоб ви могли бачити деталі про помилки виконання. Прикладами помилок виконання можуть бути AccessViolationі т. Д., Особливо якщо ваша служба працює без достатніх привілеїв для доступу до конфігураційних файлів.


0

Обліковий запис, в якому працює служба, можливо, не відобразив D: -drive (вони залежать від користувача). Спробуйте поділитися каталогом і використовуйте повний шлях до UNC у своєму backupConfig.

Ваш watcherтип FileSystemWatcher- це локальна змінна, і вона не виходить за рамки OnStartметоду. Ймовірно, він вам потрібен як екземпляр або змінна клас.


0

Я зіткнувся з тим же питанням. Моя служба завантажує / отримує XMLS та записує помилки в Журнал подій.

Коли я зайшов до Журналу подій, я спробував його відфільтрувати. Це підказало мені, що Журнал подій був пошкоджений.

Я очистив Журнал подій і все гаразд.


0

У нашому випадку у Журналах подій Windows нічого не додано, крім журналів, що проблемну службу було запущено та зупинено.

Виявляється, файл CONFIG служби недійсний. Виправлення недійсного файлу CONFIG виправлено проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.