【问题标题】:How do I code a watchdog timer to restart a Windows service?如何编写看门狗计时器以重新启动 Windows 服务?
【发布时间】:2010-11-30 15:00:22
【问题描述】:

我对另一个关于 Windows 服务看门狗计时器的问题的答案非常感兴趣(请参阅here)。该答案表明:

我还使用了在另一个线程中运行的内部看门狗系统。该线程查看主线程的活动,如日志输出或切换事件。如果未看到该活动,则认为该服务已挂起,我将关闭该服务。

在这种情况下,您可以将 Windows 配置为自动重新启动已停止的服务,这可能会清除问题(只要它不是内部逻辑错误)。

我使用的服务也有写入日志的文本日志。除了即将“睡一会儿”的服务外,我还会记录下一次醒来的时间。我使用 MTAIL 来查看日志以进行输出。”

任何人都可以提供一些示例代码如何使用在另一个线程中运行的内部看门狗,因为我目前的任务是开发一个 Windows 服务,该服务将能够在它失败、挂起等情况下自行重启。

非常感谢您的帮助。

【问题讨论】:

  • 约翰是谁?你说的不是乔恩吗?
  • 那是对的:直接到顶部。不要费心去问我们其他人傻瓜
  • 实际上是 John Dyer - 请参阅我对问题的更新。
  • 好吧,现在也许这个问题已经被英语化了一点,我们可以停止投票并开始回答它:-)
  • 属于超级用户。它专门询问如何编写看门狗进程。

标签: windows service restart watchdog


【解决方案1】:

我不喜欢在您正在观看的进程中将看门狗作为线程运行。这意味着如果整个过程由于某种原因挂起,看门狗将无法工作。

看门狗是从硬件世界中提出来的一个想法,他们做对了。使用尽可能简单的外部电路(这样可以证明它是正确的)。典型的看门狗只是简单地运行一个计时器,如果在计时器到期之前进程没有做任何事情(比如访问看门狗正在监视的内存位置),整个事情就会被重置。当看门狗被“踢”时,它会重新启动计时器。

进程踢看门狗的行为保护了该进程免于终止。

我的建议是编写一个非常简单的独立程序,它只监视一个事件(例如文件更新时间被修改)。如果该事件未在要求的时间内发生,则终止正在监视的进程(并让 Windows 重新启动它)。

然后让您观看的程序定期重写该文件。

【讨论】:

    【解决方案2】:

    您可以从服务属性配置为在失败时自动重启

    Services -> right-click your service -> Properties -> First failure : restart the service -> Second failure : restart the service -> Subsequent failure : restart 
    

    【讨论】:

    • 可能适用于某些服务,但通常总是运行但突然卡住并停止进展的服务呢?
    【解决方案3】:

    除了定期修改文件的 lastwritetime 之外,您可能还需要考虑的其他方法是创建适当的性能计数器甚至是 WMI 对象。我们在构建基础架构的后期进行,“诀窍”是在被监控的服务中找到一个有意义的工作单元,并在每次完成一个单元时脉冲你的“心跳”。

    WMI 或 Perf Counters 相对于文件方法的优势在于,您可以看到一大堆专业的 MIS/管理工具。这可以增加很多价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多