【发布时间】:2008-10-20 13:34:37
【问题描述】:
主动监控 .NET Windows 服务是否仍在运行(例如未挂起)的最佳方法是什么?服务需要定期响应计时器引发的事件。
谢谢
乔恩
【问题讨论】:
主动监控 .NET Windows 服务是否仍在运行(例如未挂起)的最佳方法是什么?服务需要定期响应计时器引发的事件。
谢谢
乔恩
【问题讨论】:
“未挂起”始终是一个很难确定的条件,并且取决于您的服务细节。
通常可以使用任何形式的进程间通信。一种简单的方法是创建一个命名共享内存映射,并简单地从您的服务定期向其中写入信息。另一个进程可以监视共享内存并查看其状态是否停止更改。
这种方法的优点是您可以扩展共享内存块以包含其他可能有助于诊断任何问题的诊断。
【讨论】:
一种方法是您可以在 .NET 中创建自己的性能计数器:
http://msdn.microsoft.com/en-us/library/5e3s61wf(VS.71).aspx
然后使用计时器将计数器绑定到“活动秒数”。
【讨论】:
显而易见的解决方案似乎是,检查它是否仍在响应。所以加了一个低频看门狗定时器。我不知道你想在哪里监控活力,但在大多数地方你应该能够从命名管道中读取。然后将看门狗定时器事件转换为对命名管道的写入。如果您没有观察到读取,您就知道您的服务无法响应至少一个计时器。
【讨论】:
您可以创建一个命名事件或互斥体,然后在代码执行时切换它。然后外部程序可以将此脉冲视为程序正在运行的指示。
我还使用了在另一个线程中运行的内部看门狗系统。该线程查看主线程的活动,如日志输出或切换事件。如果未看到该活动,则认为该服务已挂起,我将关闭该服务。在这种情况下,您可以将 Windows 配置为自动重启已停止的服务,这可能会清除问题(只要它不是内部逻辑错误)。
我使用的服务也有写入日志的文本日志。除了即将“睡一会儿”的服务,我记录下一次唤醒的时间。我使用MTAIL 来查看日志以进行输出。
【讨论】: