Перезапустить службу при возникновении исключения

Я пишу службу Windows, которая должна работать 24/7. Это довольно простой сервис, который отслеживает каталог, в который помещаются файлы, и обрабатывает эти файлы. Мне нужно перезапустить службу, если возникает необработанное исключение.

Есть ли способ перезапустить службу в случае необработанного исключения?


person Aaron M    schedule 29.07.2009    source источник


Ответы (6)


Апплет «Службы» имеет множество различных функций восстановления:

Услуги восстановления

Он может предпринимать разные действия при первом, втором и последующих сбоях:

  • Перезапустите службу после настраиваемой задержки.
  • Запустить программу (передавая параметры командной строки, возможно, включая счетчик ошибок)
  • Перезагрузите компьютер (после настраиваемой задержки и при отправке определенного сообщения)

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

И, конечно же, тем временем служба должна вести журнал того, что происходит, что должно позволить любому инструменту управления уведомлять операционную службу о том, что происходит.

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

person John Saunders    schedule 29.07.2009

Пробовали ли вы использовать вкладку «Восстановление» записи «Служба» — вы можете установить правила для сбоев, в том числе «Перезапустить службу» — по умолчанию это «Нет действий».

person JustinD    schedule 29.07.2009
comment
Я даже не знал, что это было доступно. Спасибо! - person Aaron M; 29.07.2009
comment
Я бы поостерегся этого делать. Если есть серьезное исключение, которое выдается каждый раз при запуске службы, что тогда? Как вы узнаете? - person Dan Diplo; 29.07.2009
comment
Я не говорю, что это хорошая идея - я говорю, что это можно сделать... На данный момент реальный вопрос заключается в том, почему вы планируете иметь необработанные исключения, а не перехватывать их и, если это так важно, останавливать сервис из кода. - person JustinD; 29.07.2009
comment
Вы можете настроить сервис для подсчета количества сбоев, а для первого, второго и третьего сбоя указать разные действия. вы также можете добавить счетчик сбоев в командную строку и сбросить счетчик сбоев через столько дней. - person Aaron M; 29.07.2009
comment
Два вопроса по поводу этой перезагрузки: 1. Доступна ли она до Vista? Кажется, я помню, что это было добавлено именно тогда. 2. Вы говорите сделать это с помощью вкладки рекавери. Можно ли это сделать из самого сервиса или хотя бы из установщика? Если да, то как? - person OregonGhost; 30.07.2009

При желании это можно сделать программно, этот код писал не я. Я публикую ссылку на страницу Authors CodeProject, содержащую исходные/двоичные файлы. Ниже ссылки я объяснил, как я реализовал код авторов.

http://www.codeproject.com/KB/install/serviceinstallerext.aspx

  1. Добавьте ссылку на DLL.

  2. Откройте ProjectInstaller.Designer.vb в блокноте
    В подпрограмме InitializeComponent Sub
    ИЗМЕНИТЕ
    Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller
    Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller
    TO
    Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller
    Me.ServiceInstaller1 = New Verifide.ServiceUtils.ServiceInstallerEx

  3. С объявлениями друзей в ProjectInstaller.Designer.vb
    CHANGE
    Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller
    Friend WithEvents ServiceInstaller1 As System.ServiceProcess.ServiceInstaller
    TO
    Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller
    Friend WithEvents ServiceInstaller1 As Verifide.ServiceUtils.ServiceInstallerEx

  4. ЗАМЕНИТЬ
    Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1})
    НА
    Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceInstaller1, Me.ServiceProcessInstaller1})

  5. Импорт пространства имен в ProjectInstaller.vb

  6. В ProjectInstaller.vb в Public Sub Новая функция после вызова функции компонента Initialize
    ADD
    'Set Reset Time Count - This Is 4 Days Before Count Is Reset
    ServiceInstaller1.FailCountResetTime = 60 * 60 * 24 * 4
    'ServiceInstaller1.FailRebootMsg = "Houston! We have a problem"

    'Add Failure Actions
    ServiceInstaller1.FailureActions.Add(New FailureAction(RecoverAction.Restart, 60000))
    ServiceInstaller1.FailureActions.Add(New FailureAction(RecoverAction.Restart, 60000))
    ServiceInstaller1.FailureActions.Add(New FailureAction(RecoverAction.None, 3000))

    ServiceInstaller1.StartOnInstall = True

  7. Соберите установщик и установите. Вуаля

person Mike Z    schedule 30.07.2009

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

person theGecko    schedule 29.07.2009

Лучший способ — обернуть блоки Try/Catch вокруг методов службы, которые вы можете позволить разрешить генерировать исключения.

Однако могут возникнуть серьезные исключения, которые должны привести к немедленной остановке службы. Не игнорируйте это! В этих случаях обработайте исключение, зарегистрируйте его, отправьте по электронной почте, а затем повторно создайте. Таким образом, вы будете проинформированы о том, что произошло исключение, и будете знать, что пошло не так. Затем вы можете исправить проблему и перезапустить службу вручную.

Простое игнорирование этого может привести к серьезному сбою в вашей системе, о котором вы не узнаете. Также может быть очень дорого на ЦП/ОЗУ, если служба останавливается, затем перезапускается, а затем останавливается до бесконечности.

person Dan Diplo    schedule 29.07.2009

Как предложили «John Saunders» и «theGecko», вы можете отслеживать службу и перезапускать ее в случае сбоя. Встроенная функция Windows Service Recovery поможет вам пройти долгий путь, но если вы обнаружите, что вам нужны более продвинутые функции (например, перегрузка ЦП и обнаружение зависаний), ознакомьтесь с Service Protector. Он предназначен для обеспечения круглосуточной работы важных служб Windows.

Удачи!

person CoreTech    schedule 21.07.2010