Windows服务恢复未重新启动服务

时间:2009-11-19 15:41:27

标签: windows windows-services

我将Windows服务的恢复配置为在失败后延迟一分钟重新启动。但我从来没有实际重启服务(即使有最明显的错误)。

我在EventViewer中收到了一条消息:

  

无法找到源(MyApp.exe)中事件ID(1)的说明。本地计算机可能没有必要的注册表信息或消息DLL文件来显示来自远程计算机的消息。您可以使用/ AUXSOURCE =标志来检索此描述;请参阅帮助和支持以获取详细信以下信息是事件的一部分:模块“MyApp.exe”中地址00429874处的访问冲突。写地址00456704。

还有什么我需要做的吗?我的代码中有什么东西(我使用的是Delphi)需要设置才能启用它吗?

4 个答案:

答案 0 :(得分:20)

Service Recovery旨在处理服务崩溃的情况 - 因此,如果您转到taskmgr并右键单击服务流程上的“结束流程”,恢复逻辑应该启动。我不相信服务恢复如果您的服务正常退出(即使它以错误退出),逻辑就会启动。

此外,eventvwr消息指示您的应用程序调用ReportEvent API指定事件ID 1.但您尚未使用事件查看器注册事件消息,因此无法将事件ID 1转换为有意义的文本字符串。

答案 1 :(得分:9)

Service Recovery仅适用于意外退出,例如(退出(-1))调用。 对于我们用通常方式停止服务的所有方式都不适用于恢复。 如果您想停止服务但仍希望恢复正常工作,请致电退出(-1),您会看到错误消息“服务因意外错误而停止”,然后您的服务将重新启动为恢复设置是

答案 2 :(得分:2)

如果您已将其设置为由SCM重新启动,则服务控制管理中心将尝试重新启动您的服务。这在SERVICE_FAILURE_ACTIONS结构的文档中详细here

  

服务被认为是失败的   终止而不向SERVICE_STOPPED报告状态   服务控制员。

可以通过设置SERVICE_FAILURE_ACTIONS_FLAG结构的fFailureActionsOnNonCrashFailures标记进行微调,参见here)。您可以通过选中“恢复选项卡上的启用错误停止操作”复选框,从“服务”小程序设置此设置。

  

如果此成员为TRUE并且服务已配置失败操作,则如果服务进程终止而未报告SERVICE_STOPPED状态或者它是否进入SERVICE_STOPPED状态但是SERVICE_STATUS结构的dwWin32ExitCode成员不是ERROR_SUCCESS,则故障操作将排队(0)。   如果此成员为FALSE且服务已配置失败操作,则仅当服务终止而未报告SERVICE_STOPPED状态时,失败操作才会排队。

因此,根据您的服务结构,您如何配置失败行为以及在遇到“致命错误”时所执行的操作,可能只需致电ExitProcess()exit()并返回非零值。但是,最安全的做法是确保您的服务退出时没有处理SCM的代码告诉SCM您的服务已达到SERVICE_STOPPED状态。这可确保您的失败行为始终发生......

答案 3 :(得分:0)

如果你“杀”'来自任务管理器的服务 - 忘记了恢复逻辑。在后台任务经理'杀死'过程停止服务'。并且如你所知 - 这不是服务失败。这迫使我用Visual Studio杀死它。在任务管理器中右键单击服务进程。选择调试。 在Visual Studio中选择Debug->终止所有。 现在你已经模拟了服务失败。在这种情况下,恢复逻辑工作正常。