Служба не отвечает на функцию управления (ошибка 2186)

Я занимаюсь разработкой службы с использованием .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). После удаления этого приложения все заработало как обычно!

Спасибо всем!

8
задан Luca 10 August 2010 в 09:02
поделиться

3 ответа

В общем случае каждый сервис должен делать следующие две простые вещи

  • если менеджер сервиса посылает ему управляющий код типа SERVICE_CONTROL_START, SERVICE_CONTROL_STOP и так далее, если он должен вернуться через короткий промежуток времени. С помощью функции SetServiceStatus сервис может продлить этот интервал, например, вызвав SetServiceStatus с увеличенным значением dwCheckPoint. (В .NET вместо этого можно использовать ServiceBase.RequestAdditionalTime)
  • каждый сервис должен отвечать на SERVICE_CONTROL_INTERROGATE управляющий код просто возвратом. Этот управляющий код используется менеджером сервиса для определения того, жив ли еще сервис.

Если ваша программа не следует одному из правил, вы получите ошибку "Служба не отвечает на функцию управления."

Если вы пишете программу на .NET, вам не нужно делать напрямую две вещи, которые я описал ранее. За вас это сделает класс ServiceBase. Тем не менее, вы можете легко нарушить эти правила, если создадите поток, работающий с приоритетом выше обычного, или если будете выполнять слишком долгую работу внутри OnXXX дескриптора (OnStop, OnStart, OnPowerEvent и т.д.) без вызова ServiceBase.RequestAdditionalTime. Некоторые другие трюки с дополнительными потоками также могут создавать проблемы.

5
ответ дан 5 December 2019 в 20:12
поделиться

Обычно это происходит, если вы пытаетесь выполнить слишком много работы в вызове OnStart . Например, если вы запустите бесконечный цикл в том же потоке, вы получите это сообщение об ошибке.

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

Конечно, это не помогает, если вы используете код, который ранее работал. Вы пытались перезагрузить его после сбоя? Кажется, я помню, что если у вас уже есть запущенная служба, иногда бывает сложно вернуться в рабочее состояние без ее перезагрузки. Вы можете заглянуть в свой список процессов и посмотреть, есть ли у вас еще работающая копия, и убить ее, если это так.

3
ответ дан 5 December 2019 в 20:12
поделиться

Я вижу, что есть блок кода

// Wait for new line
            Console.WriteLine("Press ENTER to exit..."); Console.ReadLine();

, как указано @Jon, поскольку это сервис. когда служба запускается, она ожидает установленное время, в течение которого она должна ответить.

есть оператор " Console.ReadLine () ", который вы обслуживаете, будет ждать, пока не будет нажата клавиша. поскольку эта служба будет ждать на этом этапе

0
ответ дан 5 December 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: