Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows服务恢复未重新启动服务_Windows_Windows Services - Fatal编程技术网

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

Windows服务恢复未重新启动服务,windows,windows-services,Windows,Windows Services,我将Windows服务的恢复配置为在出现故障后延迟一分钟重新启动。但我从未让它真正重新启动服务(即使有最明显的错误) 我确实在EventViewer中收到一条消息: 找不到源(MyApp.exe)中事件ID(1)的说明。本地计算机可能没有必要的注册表信息或消息DLL文件来显示来自远程计算机的消息。您可以使用/AUXSOURCE=标志来检索此描述;有关详细信息,请参阅帮助和支持。以下信息是事件的一部分:模块“MyApp.exe”中地址00429874处的访问冲突。写地址00456704 我还有别的

我将Windows服务的恢复配置为在出现故障后延迟一分钟重新启动。但我从未让它真正重新启动服务(即使有最明显的错误)

我确实在EventViewer中收到一条消息:

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


我还有别的事要做吗?我的代码(我使用Delphi)中是否有需要设置以启用此功能的内容?

服务恢复旨在处理服务崩溃的情况-因此,如果转到taskmgr并右键单击服务进程上的“结束进程”,则恢复逻辑应该启动。我认为,如果您的服务正常退出(即使退出时出现错误),服务恢复逻辑也不会起作用


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

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

如果您从任务管理器中“杀死”服务-忘记恢复逻辑。在后台,任务管理器通过“停止服务”来“终止”进程。正如yuo所猜测的,这不是服务失败。这迫使我用visualstudio真的杀了它。在任务管理器中,右键单击服务流程。选择调试。 在Visual studio中选择调试->全部终止。
现在您已经模拟了服务失败。在这种情况下,恢复逻辑工作正常。

如果您已将服务设置为由SCM重新启动,则服务控制管理器将尝试重新启动服务。这在
维修故障措施的文档中有详细说明

当服务失败时,该服务被视为失败 终止,但不向服务器报告服务\u已停止的状态 服务控制员

这可以通过设置
SERVICE\u FAILURE\u ACTIONS\u标志
结构的
ffailureactionsonnoncrashffailures
标志进行微调,请参阅)。通过选中“恢复”选项卡上的“为有错误的停止启用操作”复选框,可以从“服务”小程序设置此设置

如果此成员为TRUE且服务已配置故障操作,则如果服务进程终止而未报告服务\u已停止状态,或者如果服务进程进入服务\u已停止状态,但服务\u状态结构的dwWin32ExitCode成员不是ERROR\u SUCCESS(0),则故障操作将排队。 如果此成员为FALSE且服务已配置故障操作,则仅当服务终止而未报告service_STOPPED的状态时,故障操作才会排队


因此,根据您如何构建服务、如何配置故障操作以及发生“致命错误”时所做的操作,调用
ExitProcess()
exit()
并返回非零值就足够了。但是,最安全的方法可能是确保您的服务退出时,没有与SCM打交道的代码告诉SCM您的服务已达到
service\u STOPPED
状态。这将确保您的失败行为始终发生…

谢谢。这有助于了解情况。我发现,当我从taskmgr执行“结束进程”时,它会在事件查看器中生成以下结果:将在60000毫秒内采取以下纠正措施:重新启动服务。现在我的问题(与我的编码相关)是让它以“不优雅”结尾,这样恢复逻辑就会启动。如果调用ExitProcess,这应该足够了。这个问题可能对那些寻找确切方法的人有所帮助,请尝试Environment.Exit(-1);