Перезапустите службу, когда возникнет исключение - PullRequest
3 голосов
/ 29 июля 2009

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

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

Ответы [ 6 ]

2 голосов
/ 29 июля 2009

Апплет Services имеет много различных функций восстановления:

Services Recovery

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

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

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

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

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

2 голосов
/ 29 июля 2009

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

1 голос
/ 30 июля 2009

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

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

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

  2. Открыть ProjectInstaller.Designer.vb в блокноте
    В подпункте InitializeComponent
    CHANGE
    Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller
    Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller
    К
    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
    К
    Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller
    Friend WithEvents ServiceInstaller1 As Verifide.ServiceUtils.ServiceInstallerEx

  4. CHANGE
    Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1})
    TO
    Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceInstaller1, Me.ServiceProcessInstaller1})

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

  6. В ProjectInstaller.vb в Public Sub Новая функция после инициализации была вызвана функция компонента
    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. Сборка установщика и установка. Вуаля

0 голосов
/ 22 июля 2010

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

Удачи!

0 голосов
/ 29 июля 2009

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

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

Простое игнорирование может привести к серьезному отказу в вашей системе, о котором вы не знали бы. Это также может быть очень дорого для CPU / RAM, если служба останавливается, затем перезапускается, затем останавливается до бесконечности .

0 голосов
/ 29 июля 2009

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

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