如何编写看门狗定时器以重新启动Windows服务?

时间:2009-09-23 02:32:00

标签: windows service restart watchdog

我对有关Windows服务的监视计时器的另一个问题的答案非常感兴趣(参见here)。答案说:

  

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

     

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

     

我使用的服务还包含写入日志的文本日志。此外,对于即将“睡了一会儿”的服务,我会记录下次唤醒的时间。我使用MTAIL来查看输出日志。“

任何人都可以提供一些示例代码如何使用在另一个线程中运行的内部监视程序,因为我目前有一个任务来开发一个Windows服务,它可以自动重启,以防它失败,挂断等等。

我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:5)

在你正在观看的过程中,我不是一个将看门狗作为一个线程运行的忠实粉丝。这意味着如果整个过程由于某种原因而挂起,则看门狗将无法工作。

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

启动监管机构的流程的行为保护了该流程免于汇总终止。

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

然后让您观看的节目定期重写该文件。

答案 1 :(得分:4)

您可以在服务属性配置为发生故障时自动重启

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

答案 2 :(得分:3)

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

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