【问题标题】:Windows Services Recovery not restarting serviceWindows 服务恢复未重新启动服务
【发布时间】:2010-12-18 08:42:42
【问题描述】:

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

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

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

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

【问题讨论】:

标签: windows windows-services


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这对情况有所说明。我发现当我从 taskmgr 执行“结束进程”时,它会在事件查看器中生成:以下纠正措施将在 60000 毫秒内执行:重新启动服务。现在我的问题(与我的编码有关)是让它“不优雅地”终止,以便恢复逻辑启动。
  • 如果你调用 ExitProcess 就足够了。
【解决方案2】:

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

【讨论】:

  • 对于那些寻找确切方法的人,试试 Environment.Exit(-1);
【解决方案3】:

如果您已将服务设置为由 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 状态的情况下退出可能是最安全的。这可确保您的失败操作总是发生......

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多