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

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

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

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

вот мой код:

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:LogBackupConfigbackupconfig.xml";
    private static string serviceStat = @"D:LogBackupConfigStatus.txt";
    private static string fileFolderStat = @"D:LogBackupConfigFileFolderStat.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 form simulator работал нормально. В чем проблема?

обновление: После многих испытаний я заметил, что с помощью только каталога папок (без файла) служба windows не работает. Когда я заменил переменную fileWatch определенным файлом (включая его каталог), служба windows запустилась. Когда я изменил его обратно в папку, это не сработало. Я думаю, что расположение папок не работает в filewatcher.

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

9 ответов


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

  1. обратитесь к Windows Просмотр Событий. Обычно вы можете добраться до этого, перейдя в диспетчер компьютеров / серверов, а затем нажав Просмотр Событий ->Журналы Windows ->приложение. Вы можете увидеть, что бросило исключение здесь, которое может помочь, но вы не получите трассировку стека.
  2. извлеките логику программы в проект класса библиотеки. Теперь создайте две разные версии программы: консольное приложение (для отладки) и службу windows. (Это немного первоначальные усилия, но экономит много страха в долгосрочной перспективе.)
  3. добавьте больше блоков try / catch и войдите в приложение, чтобы получить лучшее представление о том, что происходит.

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

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

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

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


Я нашел его очень удобным для преобразования существующего служба windows до консоль просто изменив свою программу следующим образом. С помощью этого изменения можно запустить программу путем отладки в visual studio или запуска исполняемого файла в обычном режиме. Но он также будет работать как служба windows. Я также сделал сообщение в блоге о это

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

пожалуйста, проверьте, что вы зарегистрировали все конечные точки HTTP в локальном списке управления доступом mahcine (ACL)

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


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


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

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

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

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


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

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


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

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


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

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

я очистил журнал событий и все в порядке.