我将Windows服务的恢复configuration为在失败后以一分钟的延迟重新启动。 但我从来没有得到它实际上重新启动服务(即使是最明显的错误)。
我在EventViewer中收到一条消息:
源(MyApp.exe)中的事件ID(1)的说明找不到。 本地计算机可能没有必要的registry信息或消息DLL文件来显示来自远程计算机的消息。 您可能能够使用/ AUXSOURCE =标志来检索此说明; 详细信息请参阅帮助和支持。 以下信息是事件的一部分:模块“MyApp.exe”中地址为00429874的访问冲突。 写地址00456704。
还有什么我需要做的吗? 在我的代码中有什么东西(我使用Delphi)需要设置启用它?
服务恢复的目的是处理服务崩溃的情况 – 所以如果你去taskmgr,并右键单击服务进程的“结束进程”,恢复逻辑应该踢。我不相信服务恢复逻辑踢如果你的服务正常退出(即使退出时出错)。
此外,eventvwr消息表明您的应用程序调用了指定事件ID 1的ReportEvent API。但是,您尚未使用事件查看器注册事件消息,因此无法将事件ID 1转换为有意义的文本字符串。
服务恢复仅适用于意外退出,如( 退出(-1) )调用。 我们用通常的方式停止服务的所有方式都不适用于恢复。 如果您想要停止服务,并且仍希望恢复正常工作,请调用exit(-1) ,您将看到错误消息为“服务因意外错误而停止”,然后您的服务将在恢复设置时重新启动。
如果你从任务管理器中“终止”服务 – 忘记恢复逻辑。 在后台任务管理器通过“停止服务”“杀死”进程。 而且可以猜测 – 这不是服务失败。 这迫使我真的用Visual Studio杀死它。 在任务管理器右键单击服务进程。 选择调试。 在Visual Studio中选择Debug-> Terminate All。 而现在你已经模拟服务失败。 在这种情况下恢复逻辑工作正常。
如果您将服务设置为由SCM重新启动,服务控制管理器将尝试重新启动您的服务。 这在SERVICE_FAILURE_ACTIONS
结构的文档中详细介绍。
服务在终止时将被视为失败,而不向服务控制器报告SERVICE_STOPPED状态。
这可以通过设置SERVICE_FAILURE_ACTIONS_FLAG
结构的fFailureActionsOnNonCrashFailures
标志进行微调,参见这里 )。 您可以通过选中“恢复”选项卡上的“为错误停止启用操作”复选框,从“服务”小程序中设置此设置。
如果此成员为TRUE并且服务配置了失败操作,那么如果服务进程终止而没有报告SERVICE_STOPPED状态,或者它进入了SERVICE_STOPPED状态,但SERVICE_STATUS结构的dwWin32ExitCode成员不是ERROR_SUCCESS(0) 。 如果此成员为FALSE并且服务已配置失败操作,则只有在服务终止但未报告SERVICE_STOPPED状态的情况下,失败操作才会排队。
所以,根据你如何构建你的服务,你如何配置你的失败行为和你做什么,当你有'致命错误'可能足以调用ExitProcess()
或exit()
并返回一个非零值。 但是,确保您的服务在没有处理SCM的代码时告诉SCM您的服务已达到SERVICE_STOPPED
状态是最安全的。 这确保您的失败行为总是发生…