Служба 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 ответов
Если служба запускается и останавливается таким образом, это означает, что ваш код выдает необработанное исключение. Это довольно сложно отладить,но есть несколько вариантов.
- обратитесь к Windows Просмотр Событий. Обычно вы можете добраться до этого, перейдя в диспетчер компьютеров / серверов, а затем нажав Просмотр Событий ->Журналы Windows ->приложение. Вы можете увидеть, что бросило исключение здесь, которое может помочь, но вы не получите трассировку стека.
- извлеките логику программы в проект класса библиотеки. Теперь создайте две разные версии программы: консольное приложение (для отладки) и службу windows. (Это немного первоначальные усилия, но экономит много страха в долгосрочной перспективе.)
- добавьте больше блоков 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
используйте таймер и отметьте событие, чтобы скопировать файлы.
при запуске службы запустите время и укажите интервал во времени.
таким образом, служба продолжает работать и копировать файлы ontick.
надеюсь, что это поможет.
вы можете захотеть модульный тест инициализации-но потому, что он находится в OnStart
метод это почти невозможно. Я бы предложил переместить код инициализации в отдельный класс, чтобы его можно было протестировать или, по крайней мере, повторно использовать в тестере форм.
во-вторых, чтобы добавить некоторое ведение журнала (используя такой как log4net или аналогичный) и добавьте подробное ведение журнала, чтобы вы могли видеть подробности об ошибках выполнения. Примерами ошибок выполнения будет AccessViolation
etc. особенно если ваша служба работает без достаточных привилегий для доступа к файлам конфигурации.
учетная запись, на которой запущена служба, возможно, не сопоставила диск D:-(они зависят от пользователя). Попробуйте поделиться каталогом и использовать полный UNC-путь в своем backupConfig
.
код watcher
типа FileSystemWatcher
локальная переменная, и выходит за рамки, когда OnStart
способ это сделать. Вероятно, вам это нужно как переменная экземпляра или класса.
Я столкнулся с той же проблемой. Моя служба загружает / получает XMLS и записывает ошибки в журнал событий.
когда я пошел в журнал событий, я попытался отфильтровать его. Это подсказывает мне, что журнал событий был поврежден.
я очистил журнал событий и все в порядке.