【问题标题】:How do you get the current failure count for a windows service您如何获取 Windows 服务的当前故障计数
【发布时间】:2010-12-24 03:10:30
【问题描述】:

我的服务在某些资源不可用时会失败。我已将其配置为尝试重新启动两次,然后在第三次尝试时向我发送 SMS。不幸的是,windows 只为您提供了在一定数量 后重置失败计数的选项,而我真的希望它在每三次失败时重置一次。问题是一旦服务再次运行,一个失败将导致它发送另一条短信,甚至不会尝试重新启动服务。

所以我想在我的 SMS 脚本中包含一些代码来重置失败计数器。我找到了以下注册表位置:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\

其中包含失败操作的其他内容(二进制)设置,但据我所知没有计数器。

sc 命令可让您查询各种内容,但也不返回失败计数。

理想情况下,我想要一种以编程方式查询/重置故障计数器的方法,但命令行或注册表解决方案会很好(因为我可以编写脚本)。

【问题讨论】:

  • 我正在研究这个,我相信你可以通过 WMI /root/cimv2:Win32_Service 接口来做到这一点。我会继续研究并回复您。
  • 无法通过 WMI 界面执行此操作。我不知道如何提供帮助。我会继续做一些检查。
  • @Wayne:感谢您的调查。我不是 win32 api 专家,所以我真的不知道从哪里开始。你会认为有办法的。

标签: windows-services reset counter


【解决方案1】:

Win32 API 允许您指定在 X 秒而不是 X 天后重置失败计数。查看 SERVICE_FAILURE_ACTIONS 结构的 dwResetPeriod 成员。

故障计数器本身,它在 SCM 内部私下维护,它知道自 Windows 启动以来给定服务失败的次数。应用程序无法访问该计数器以手动重置,甚至无法进行查询。

【讨论】:

  • 多么令人震惊的不足!这意味着诸如“每三次失败发送短信”之类的行为是不可能的。通过 API,我可以设置重置时间,使其与 wait-restart-wait-restart-sms 周期相吻合,但是 A)假设可预测的故障时间,B)我不喜欢通过 API 配置服务当 UI 无法处理这些设置时。
【解决方案2】:

我是名为 Daemoniq 的开源 Windows 服务托管框架的开发人员。 Setting service recovery options 是它的功能之一。可以从http://daemoniq.org下载

目前的功能包括:

  • 通过 CommonServiceLocator 与容器无关的服务位置
  • 通过 app.config 设置常用服务属性,如 serviceName、displayName、description 和 serviceStartMode
  • 在同一进程上运行多个 Windows 服务
  • 通过 app.config 设置恢复选项
  • 通过 app.config 设置依赖的服务
  • 通过命令行设置服务进程凭据
  • 通过命令行安装、卸载、调试服务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多