Подтвердить что ты не робот

Служба Windows на локальном компьютере началась, а затем остановлена ​​ошибка

Обычно я получаю эту ошибку: (Служба "имя службы" на локальном компьютере началась, а затем остановлена. Некоторые службы автоматически останавливаются, если они не используются другой службой или программами), когда что-то не так с моим кодом, например, с несуществующими дорожками дисков и т.д. Окна служба не запускается.

У меня есть служба Windows, которая выполняет резервное копирование папки/файлов, до местоположения, если она достигает предела размера. Все детали предоставляют конфигурацию XML, которую служба Windows читает при запуске. У меня есть отдельные формы окон, в которых есть кнопка, которая делает то же самое, что делает моя служба windows onstart. Я использую свои формы окон для отладки кода, прежде чем поместить его в свою службу Windows.

Когда я запускаю свои окна. Он делает то, что он должен делать. Когда я поместил свой код в метод OnStart() службы Windows, появилась ошибка.

Здесь мой код:

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 не запускаться, симулятор оконных окон отлично работал. Какая проблема?

UPDATE: После многих испытаний я заметил, что с использованием только папки (w/out file) служба Windows не работает. Когда я заменил переменную fileWatch конкретным файлом (включая его каталог), запустилась служба Windows. Когда я вернул его в папку, это не сработало. Я думаю, что расположение папок не работает в файловой машине.

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

4b9b3361

Ответ 1

Если служба запускается и останавливается таким образом, это означает, что ваш код бросает необработанное исключение. Это довольно сложно отладить, но есть несколько вариантов.

  • Обратитесь к средству просмотра событий Windows. Обычно вы можете добраться до этого, перейдя к диспетчеру компьютер/сервер, затем нажмите "Просмотр событий" → "Журналы Windows" → "Приложение". Вы можете увидеть, что здесь вызвало исключение, что может помочь, но вы не получите трассировку стека.
  • Извлеките вашу программную логику в проект класса библиотеки. Теперь создайте две разные версии программы: консольное приложение (для отладки) и службу Windows. (Это немного начальное усилие, но в долгосрочной перспективе он сохраняет много тоски.)
  • Добавьте еще несколько блоков try/catch и войдите в приложение, чтобы получить лучшее представление о том, что происходит.

Ответ 2

Не уверен, что это будет полезно, но для отладки службы вы всегда можете использовать следующее в методе OnStart:

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

чем вы могли бы прикрепить свою визуальную студию к процессу и иметь лучшие возможности отладки.

надеюсь, что это было полезно, удачи

Ответ 3

Мне было очень удобно преобразовать существующий сервис 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
    }
}

Ответ 5

EventLog.Log должен быть установлен как "Приложение"

Ответ 6

Между тем, по другой причине: случайно удалил файл .config, вызвав то же сообщение об ошибке:

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

Ответ 7

Используйте таймер и галочку для копирования ваших файлов.

При запуске службы запустите время и укажите интервал времени.

Таким образом, служба продолжает работать и копирует файлы.

Надеюсь, что это поможет.

Ответ 8

Вы можете захотеть unit test инициализации, но поскольку это в методе OnStart, это почти невозможно. Я бы предложил переместить код инициализации в отдельный класс, чтобы он мог быть протестирован или, по крайней мере, повторно использован в тесте формы.

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

Ответ 9

Учетная запись, на которой запущена служба, может не отобразить D: -drive (они зависят от пользователя). Попробуйте совместно использовать каталог и используйте полный UNC-путь в backupConfig.

Ваш watcher типа FileSystemWatcher является локальной переменной и выходит за рамки, когда выполняется метод OnStart. Вероятно, вам это нужно как переменная экземпляра или класса.

Ответ 10

Я столкнулся с той же проблемой. Моя служба загружает/принимает XMLS и записывает ошибки в журнал событий.

Когда я пошел в журнал событий, я попытался отфильтровать его. Это подсказывает мне, что журнал событий поврежден.

Я очистил журнал событий и все ОК.

Ответ 11

В нашем случае ничего не было добавлено в журналы событий Windows, кроме журналов, что проблемная служба была запущена, а затем остановлена.

Оказывается, файл CONFIG службы был недействительным. Исправление неверного файла CONFIG устранило проблему.