Я занимаюсь разработкой службы с использованием .NET на платформах Windows.
Это работало до вчерашнего дня ... но сегодня не хочет начинать !!! Это кажется странным, и я чувствую, что что-то упустил ...
Я также пытался вернуть исходные коды к последней рабочей версии, но больше ничего не происходит: net start выводит:
Служба не отвечает на функцию управления.
Что может вызвать эту неисправность?
Вероятно, большинство из вас хочет узнать о ней больше. Итак, позвольте мне показать вам некоторый код:
Служебный код:
#if DEBUG
class iGeckoService : DebuggableService
#else
class iGeckoService : ServiceBase
#endif
{
static void Main()
{
#if DEBUG
if (Debugger.IsAttached == true) {
DebuggableService[] services = Services;
// Create console
AllocConsole();
// Emulate ServiceBase.Run
foreach (DebuggableService service in services)
service.Start(null);
// Wait for new line
Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();
// Emulate ServiceBase.Run
foreach (DebuggableService service in services)
service.Stop();
} else
ServiceBase.Run(Services);
#else
ServiceBase.Run(Services);
#endif
}
#if DEBUG
static DebuggableService[] Services
{
get {
return (new DebuggableService[] { new iGeckoService() });
}
}
[DllImport("kernel32")]
static extern bool AllocConsole();
#else
static DebuggableService[] Services
{
get {
return (new ServiceBase[] { new iGeckoService() });
}
}
#endif
#endregion
#region Constructors
/// <summary>
/// Default constructor.
/// </summary>
public iGeckoService()
{
// Base properties
ServiceName = DefaultServiceName;
// Service feature - Power events
}
#endregion
protected override void OnStart(string[] args)
{
try {
...
} catch (Exception e) {
sLog.Error("Unable to initialize the service. Request to stop.", e);
}
}
/// <summary>
/// Stop this service.
/// </summary>
protected override void OnStop()
{
...
}
}
[RunInstaller(true)]
public class iGeckoDaemonInstaller : Installer
{
/// <summary>
/// Default constructor.
/// </summary>
public iGeckoDaemonInstaller()
{
ServiceProcessInstaller spi = new ServiceProcessInstaller();
spi.Account = ServiceAccount.LocalSystem;
ServiceInstaller si = new ServiceInstaller();
si.ServiceName = iGeckoService.DefaultServiceName;
si.StartType = ServiceStartMode.Automatic;
Installers.AddRange(new Installer[] {spi, si});
}
}
class DebuggableService : ServiceBase
{
public void Start(string[] args) { OnStart(args); }
}
Стартовый скрипт:
installutil ..\bin\Debug\iGeckoService.exe
net start "Gecko Videowall"
, а стоп-скрипт:
net stop "Gecko Videowall"
installutil /u ..\bin\Debug\iGeckoService.exe
Однако я думаю, что это системная настройка, так как приложение имеет работал хорошо до последнего дня. (Вздох).
Обновление
Когда служба работала, я использовал log4net для регистрации активности службы (я не могу подключить отладчик к работающей службе ...), и он всегда регистрировался.
Отныне, log4net log никогда не создается (даже если я включаю опцию внутренней отладки), даже если я регистрируюсь в подпрограмме Main!
Другое обновление
Кажется, что приложение никогда не выполняется. Я сократил каждую подпрограмму (Main, OnStart, OnStop) и запускаю пустой сервис. Процедура OnStart создает файл в каталоге (полностью доступный для записи всем пользователям), но когда служба запускается, файл не создается.
Еще одно обновление
, вдохновленное комментарием Роба, я видел это сообщение на средство просмотра событий:
> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b
> Exception code: 0x80000003
> Fault offset: 0x000000000004f190
> Faulting process id: 0x1258
> Faulting application start time: 0x01cb384a726c7167
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
> Report Id: b096a237-a43d-11df-afc4-001e8c414537
Это, безусловно, причина отключения службы ... не возникает вопрос: « Как его отладить? » (Спасибо, Роб, я никогда не думал о событии зритель до сих пор!)
Еще одно обновление.
Кажется, что приложение никогда не выполняется. Я сократил каждую подпрограмму (Main, OnStart, OnStop) и запускаю пустой сервис. Процедура OnStart создает файл в каталоге (полностью доступный для записи всем пользователям), но когда служба запускается, файл не создается.
Еще одно обновление
, вдохновленное комментарием Роба, я видел это сообщение на средство просмотра событий:
> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b
> Exception code: 0x80000003
> Fault offset: 0x000000000004f190
> Faulting process id: 0x1258
> Faulting application start time: 0x01cb384a726c7167
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
> Report Id: b096a237-a43d-11df-afc4-001e8c414537
Это, безусловно, причина отключения службы ... не возникает вопрос: « Как его отладить? » (Спасибо, Роб, я никогда не думал о событии зритель до сих пор!)
Еще одно обновление.
Кажется, что приложение никогда не выполняется. Я сократил каждую подпрограмму (Main, OnStart, OnStop) и запускаю пустой сервис. Процедура OnStart создает файл в каталоге (полностью доступный для записи всем пользователям), но когда служба запускается, файл не создается.
Еще одно обновление
, вдохновленное комментарием Роба, я видел это сообщение на средство просмотра событий:
> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b
> Exception code: 0x80000003
> Fault offset: 0x000000000004f190
> Faulting process id: 0x1258
> Faulting application start time: 0x01cb384a726c7167
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
> Report Id: b096a237-a43d-11df-afc4-001e8c414537
Это, безусловно, причина отключения службы ... не возникает вопрос: « Как его отладить? » (Спасибо, Роб, я никогда не думал о событии зритель до сих пор!) Отладка, выполняемая как консольное приложение, не выдает никакой ошибки, на самом деле она, похоже, связана со средой обслуживания. Единственное, что мне приходит в голову, может быть какая-то ошибка загрузки DLL, так как теперь служба пуста ... есть идеи?
(Спасибо всем за то, что следите за мной ... Я хотел бы предложить вам пиццу и пиво )
Решено!
Службе не удалось запуститься после сбоя перед основной программой, вызванного установкой и настройкой MS Application Verifier (x64). После удаления этого приложения все заработало как обычно!
Спасибо всем!
В общем случае каждый сервис должен делать следующие две простые вещи
SERVICE_CONTROL_START
, SERVICE_CONTROL_STOP
и так далее, если он должен вернуться через короткий промежуток времени. С помощью функции SetServiceStatus
сервис может продлить этот интервал, например, вызвав SetServiceStatus
с увеличенным значением dwCheckPoint
. (В .NET вместо этого можно использовать ServiceBase.RequestAdditionalTime)SERVICE_CONTROL_INTERROGATE
управляющий код просто возвратом. Этот управляющий код используется менеджером сервиса для определения того, жив ли еще сервис. Если ваша программа не следует одному из правил, вы получите ошибку "Служба не отвечает на функцию управления."
Если вы пишете программу на .NET, вам не нужно делать напрямую две вещи, которые я описал ранее. За вас это сделает класс ServiceBase
. Тем не менее, вы можете легко нарушить эти правила, если создадите поток, работающий с приоритетом выше обычного, или если будете выполнять слишком долгую работу внутри OnXXX дескриптора (OnStop
, OnStart
, OnPowerEvent
и т.д.) без вызова ServiceBase.RequestAdditionalTime. Некоторые другие трюки с дополнительными потоками также могут создавать проблемы.
Обычно это происходит, если вы пытаетесь выполнить слишком много работы в вызове OnStart
. Например, если вы запустите бесконечный цикл в том же потоке, вы получите это сообщение об ошибке.
Обычно служба должна создать новый поток в вызове OnStart
, а затем аккуратно завершить его в вызове OnStop
.
Конечно, это не помогает, если вы используете код, который ранее работал. Вы пытались перезагрузить его после сбоя? Кажется, я помню, что если у вас уже есть запущенная служба, иногда бывает сложно вернуться в рабочее состояние без ее перезагрузки. Вы можете заглянуть в свой список процессов и посмотреть, есть ли у вас еще работающая копия, и убить ее, если это так.
Я вижу, что есть блок кода
// Wait for new line
Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();
, как указано @Jon, поскольку это сервис. когда служба запускается, она ожидает установленное время, в течение которого она должна ответить.
есть оператор " Console.ReadLine ()
", который вы обслуживаете, будет ждать, пока не будет нажата клавиша. поскольку эта служба будет ждать на этом этапе