Как мне запрограммировать сторожевой таймер для перезапуска службы Windows?

Меня очень интересует ответ на другой вопрос, касающийся сторожевых таймеров для служб Windows (см. здесь). В этом ответе говорилось:

Я также использовал внутреннюю сторожевую систему, работающую в другом потоке. Этот поток просматривает основной поток на предмет активности, такой как вывод журнала или событие переключения. Если активность не отображается, служба считается зависшей, и я закрываю ее.

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

Также службы, с которыми я работаю, имеют текстовые журналы, которые записываются в журнал. В дополнение к службам, которые собираются ненадолго засыпать, я записываю время следующего пробуждения. Я использую MTAIL для просмотра журнала на предмет вывода.

Может ли кто-нибудь дать образец кода, как использовать внутренний сторожевой таймер, работающий в другом потоке, поскольку в настоящее время у меня есть задача разработать службу Windows, которая сможет самостоятельно перезапускаться в случае сбоя, зависания и т. Д.

Я действительно ценю твою помощь.


person Community    schedule 23.09.2009    source источник
comment
Кто такой Джон? Вы случайно не имеете в виду Джона?   -  person Ash    schedule 23.09.2009
comment
Это было бы правильно: идти прямо к вершине. Не беспокойтесь спрашивать остальных из нас пустышки.   -  person pavium    schedule 23.09.2009
comment
На самом деле это был Джон Дайер - см. Мое обновление вопроса.   -  person paxdiablo    schedule 23.09.2009
comment
Хорошо, теперь, возможно, вопрос был немного переведен на английский язык, мы могли бы перестать голосовать против него и начать отвечать на него :-)   -  person paxdiablo    schedule 23.09.2009
comment
Это не принадлежит суперпользователю. Он конкретно спрашивает, как кодировать сторожевой процесс.   -  person paxdiablo    schedule 23.09.2009
comment
Ой, теперь первый комментарий не имеет смысла! :(   -  person RCIX    schedule 23.09.2009
comment
S'ok, @RCIX, народ посмотрят историю редактирования. И знаете ли вы, что звучите в точности как Swiper из Dora the Explorer (Ой, чувак). Это будет иметь смысл только для родителей с детьми в возрасте от 2 до 5 лет и, возможно, некоторых очень странных взрослых без детей, вы знаете, тех, кто перешел с манги на что-то даже более детское :-)   -  person paxdiablo    schedule 23.09.2009
comment
Я совершенно не собирался так звучать, я даже шоу не смотрю! хотя могу я спросить, откуда ВЫ это знаете? ;)   -  person RCIX    schedule 23.09.2009
comment
Спасибо, Пакс. Я попробую ваше предложение. Спасибо ArsenMkrt, я тоже попробую ваше предложение по установке служебного свойства. --Джефф   -  person    schedule 23.09.2009
comment
Я собираюсь бросить это здесь и надеюсь, что следующий читатель найдет его хорошо: Code Project: Watchdog Сервис   -  person abutbul    schedule 05.07.2011
comment
stackoverflow.com/ questions / 220382 / Это может быть лучшим решением   -  person Hoang Nguyen    schedule 17.04.2013


Ответы (3)


Я не большой поклонник запуска сторожевого пса как потока в процессе, который вы наблюдаете. Это означает, что если весь процесс по какой-то причине зависнет, сторожевой таймер не будет работать.

Сторожевые псы - это идея, пришедшая из мира оборудования, и они были правы. Используйте внешнюю схему как можно проще (чтобы она могла быть доказуемо правильной). Типичные сторожевые таймеры просто запускают таймер, и, если процесс ничего не сделал до истечения таймера (например, доступ к месту в памяти, за которым наблюдал сторожевой таймер), все это сбрасывалось. Когда сторожевой таймер "пинает", он перезапускает таймер.

Действие процесса, запускающее сторожевой таймер, защищало этот процесс от суммарного завершения.

Я бы посоветовал написать очень простую автономную программу, которая просто отслеживала бы событие (например, изменение времени обновления файла). Если это событие не произошло в течение требуемого времени, завершите наблюдаемый процесс (и позвольте Windows перезапустить его).

Затем попросите вашу просматриваемую программу периодически перезаписывать этот файл.

person paxdiablo    schedule 23.09.2009

Вы можете настроить в свойствах службы самозапуск в случае сбоя.

Services -> right-click your service -> Properties -> First failure : restart the service -> Second failure : restart the service -> Subsequent failure : restart 
person Arsen Mkrtchyan    schedule 23.09.2009
comment
Может работать для некоторых служб, но как насчет службы, которая обычно всегда запускается, но внезапно застревает и перестает работать? - person Roman Starkov; 20.04.2010

Другие подходы, которые вы, возможно, захотите рассмотреть, помимо регулярного изменения времени последней записи файла, - это создание надлежащего счетчика производительности или даже объекта WMI. Мы делаем это позже в нашей инфраструктуре сборки, «хитрость» заключается в том, чтобы найти значимую рабочую единицу в отслеживаемой службе и пульсировать ваше «сердцебиение» каждый раз, когда работа над единицей завершается.

Преимущество WMI или Perf Counters по сравнению с файловым подходом состоит в том, что вы становитесь видимыми для целого ряда профессиональных инструментов MIS / управления. Это может добавить большую ценность.

person Tom Kirby-Green    schedule 23.09.2009