Служба не отвечает на функцию управления (ошибка 2186) - PullRequest
7 голосов
/ 10 августа 2010

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

Это, безусловно, причина отключения службы ... не возникает вопрос: " Какотладить его?"(Спасибо, Роб, я до сих пор никогда не думал о средстве просмотра событий!). Отладка, выполняемая как консольное приложение, не выдает никакой ошибки, на самом деле, похоже, что она связана со средой службы.Единственное, что мне приходит в голову, может быть какая-то ошибка загрузки DLL, так как теперь сервис пуст ... любая идея?

(Спасибо всем за то, что следите за мной ... Я хотел бы предложить вампицца и пиво)


Решено!

Службе не удалось запустить после сбоя до основной процедуры, вызванной установкой и настройкойMS Application Verifier (x64).После удаления этого приложения все заработало как обычно!

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

Ответы [ 4 ]

5 голосов
/ 10 августа 2010

Как правило, каждая служба должна выполнять две простые вещи:

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

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

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

3 голосов
/ 10 августа 2010

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

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

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

0 голосов
/ 13 мая 2019

Для меня это просто означало, что было выброшено исключение. (Конфликт платформы в Configuration Manager, приводящий к «неправильному формату изображения».) Попробуйте запустить .exe из командной строки и посмотрите, не появляется ли ошибка.

0 голосов
/ 10 августа 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...