Как узнать текущее количество сбоев для службы Windows

У меня есть служба, которая не работает при недоступности определенных ресурсов. Я настроил его на попытку перезапуска дважды, а затем отправьте мне SMS с третьей попытки. К сожалению, Windows дает вам возможность сбросить счетчик сбоев только через определенное количество дней, тогда как я действительно хочу, чтобы он сбрасывался при каждом третьем сбое. Проблема в том, что после того, как служба снова будет запущена, еще еще один сбой приведет к тому, что она отправит еще одно SMS и даже не попытается перезапустить службу.

Поэтому я хочу включить в свой сценарий SMS некоторый код для сброса счетчика отказов. Я нашел следующее место в реестре:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \

Которая содержит среди прочего (двоичные) настройки для действий при сбое, но, насколько я могу судить, нет счетчика.

Команда sc позволяет запрашивать всевозможные данные, но также не возвращает счетчик сбоев.

В идеале мне нужен способ запрашивать / сбрасывать счетчик отказов программно, но подойдет командная строка или решение для реестра (поскольку я могу их написать).


person Draemon    schedule 07.12.2009    source источник
comment
Я изучаю это, я считаю, что вы можете сделать это через интерфейс WMI / root / cimv2: Win32_Service. Я продолжу исследование и вернусь к вам.   -  person Wayne Arthurton    schedule 07.12.2009
comment
Нет возможности сделать это через интерфейс WMI. Я не понимаю, как мне помочь. Я продолжу кое-что проверять.   -  person Wayne Arthurton    schedule 07.12.2009
comment
@Wayne: Спасибо, что изучили это. Я не эксперт по Win32 api, поэтому не знаю, с чего начать. Можно подумать, есть способ.   -  person Draemon    schedule 08.12.2009


Ответы (2)


Win32 API позволяет указать, что счетчик сбоев будет сброшен через X секунд, а не через X дней. Посмотрите на элементы dwResetPeriod структуры SERVICE_FAILURE_ACTIONS.

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

person Remy Lebeau    schedule 09.12.2009
comment
Какая шокирующая неадекватность! Это означает, что такое поведение, как SMS при каждом третьем сбое, невозможно. С помощью API я мог бы установить время сброса так, чтобы оно совпадало с циклом ожидания-перезапуска-ожидания-перезапуска-sms, но А) предполагает предсказуемые сроки сбоя, и Б) Мне не нравится настраивать службу через API. когда пользовательский интерфейс не может обрабатывать эти настройки. - person Draemon; 09.12.2009

Я разработчик фреймворка для хостинга служб Windows с открытым исходным кодом под названием Daemoniq. Настройка параметров восстановления службы - одна из его функций. Вы можете скачать его с http://daemoniq.org

Текущие функции включают:

  • расположение службы, не зависящей от контейнера, через CommonServiceLocator
  • установить общие свойства службы, такие как serviceName, displayName, description и serviceStartMode через app.config
  • запускать несколько служб Windows в одном процессе
  • установить параметры восстановления через app.config
  • установить сервисы, зависящие от app.config
  • установить учетные данные сервисного процесса через командную строку
  • установка, удаление, отладка сервисов через командную строку
person jake.stateresa    schedule 10.12.2009