检查服务是否挂起的最佳方法

5
我有一个关于如何最好地检查服务是否仍在运行的问题。
首先需要澄清一下,我拥有的服务是一个C#应用程序,可以从命令行运行,也可以作为Windows服务运行。该服务的功能是检查远程第三方数据源的更改,并在将其添加到我们自己的本地数据存储之前处理这些更改。
我希望能够识别出服务由于任何原因停止运行,并尽可能自动地通知某个人。无论服务是作为Windows服务还是从命令行运行,都需要发生这种情况。
我已经考虑过监视本地数据存储以进行更改并在一定时间内未发生更改时通知,但是这被证明有点不一致,因为第三方数据源的更改频率是可变的,这意味着长时间缺少更改不一定表示服务已停止工作,可能只是没有更改!
有没有关于如何监视此内容的建议?有没有任何类似的经验?
谢谢,M
编辑1 只是大致介绍一下服务的工作方式:当新/更新数据可用时,第三方服务会引发事件,因此我的服务等待这些事件被引发并处理引发事件中返回的数据。因此,很难确定“没有更改”而不是“服务已崩溃”。
编辑2 我认为我需要更清楚一些:监视的主要原因是通知用户可能存在的服务问题或与第三方服务的连接问题。该服务本身是单线程的,并具有适当的异常处理和日志记录。很有可能这个服务将在某个服务器上运行,因此如果服务出现任何问题并且由于任何原因停止更新我们的本地数据存储,则服务需要通知某个人。

您的服务是否具有某种轮询循环? - Matthew Watson
你可以展示一下你的服务的伪代码大纲吗?我们可以帮助识别出放置某种心跳的位置。 - KingCronus
3个回答

5
您可能需要考虑类似“心跳”的东西: Windows服务的心跳活动 但您主要需要考虑的是为什么您的服务会停止或挂起?需要捕获所有异常,并在最坏情况下,在短暂等待后将服务重置为其启动状态,以防止CPU过载。
Windows本身也有各种方法来帮助解决问题:
Start > Run > Services.msc > Right Click Service > Properties > Recovery Options

如果您设计应用程序以正确使用异常并适当处理它们,那么您不应该遇到服务“因某些原因而挂起”的问题。
额外信息:
您无法确定“无需工作”和挂起之间的区别吗?

最糟糕的情况是,如果服务是多线程的,并且发生了活锁或死锁。 - Matthew Watson
@MatthewWatson 是的,心跳可能有所帮助,但我仍然希望考虑根本原因。使用适当的线程安全编程几乎总是可以纠正死锁和活锁问题。 - KingCronus

0

在 .net 中,您可以使用 ServiceController 类来监视服务。

我在我的一个项目中遇到了同样的问题。

我使用了以下方法来监视我的服务:

  • 首先,我将我的服务中的所有信息和错误记录到事件查看器中,以标准格式记录如下:

自定义事件 ID | 日期时间 | 消息

  • 然后,我创建了另一个通知服务,它将监听特定事件的事件查看器,读取事件条目中的消息
  • 如果事件条目出现在事件查看器中,则通过 SMTP 发送邮件通知
  • 如果没有提供 SMTP,则可以使用 Windows 应用程序来监听事件并使用气球或消息框显示消息

-1
这个项目的解决方案是使用类似心跳的实现方式,让服务通知我它的可用性。
由于我们的应用程序使用WebAPI,我能够设置一个端点,服务每隔[x]秒就会“ping”一次。
另外添加了一个进程,检查服务最后一次通知的日期和时间,如果不在设定的阈值内,我会通知用户该服务不可用。
我曾考虑使用ServiceController,但由于该服务所添加的功能可能作为Windows控制台应用程序而不是Windows服务运行,因此那并不是理想的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接