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

时间:2013-05-31 10:55:22

标签: c# service monitoring

我有一个关于如何最好地检查服务是否仍在运行的问题。

首先澄清一下。我的服务是一个C#应用程序,可以从命令行运行,也可以作为Windows服务运行。该服务的功能是检查对远程第三方数据源的更改,并在将这些更改添加到我们自己的本地数据存储之前处理这些更改。

我希望能够确定服务何时因任何原因停止运行,并尽可能自动地通知某人。无论服务是作为Windows服务运行还是从命令行运行,都需要进行此操作。

我已经考虑过监控本地数据存储区的更改并通知在一段时间内没有发生更改,但事实证明这有点太不一致,因为第三方数据的更改频率source是可变的,这意味着长期缺乏更改并不一定表明服务已停止工作,可能只是没有变化!

对于我如何监控此问题有什么建议吗?任何人都有类似的经历吗?

谢谢,M

修改1 只是粗略地了解服务是如何工作的:当新的/更新的数据可用时,第三方服务会引发事件,因此我的服务就会等待引发这些事件并处理引发事件中返回的数据。因此,这就是为什么识别“没有变化”而不是“服务崩溃”的原因很棘手。

编辑2 我想我需要更清楚一点:这种监控的主要原因是通知用户有关服务或与第三方服务的连接的潜在问题。服务本身是单线程的,具有适当的异常处理和日志记录。有可能这项服务将在某个服务器上运行,所以如果服务有任何问题,它会因为服务需要通知某人的原因而停止更新我们的本地数据存储。

3 个答案:

答案 0 :(得分:5)

你可能想要考虑像'心跳'这样的东西:

Heartbeat activity for Windows Service

但您的主要考虑应该是解决为什么您的服务应该能够停止/挂起?需要捕获所有异常,并且在最坏的情况下,在短暂等待后将服务重置为其启动状态以防止CPU最大化。

Windows本身也有各种方法可以提供帮助:

Start > Run > Services.msc > Right Click Service > Properties > Recovery Options

如果您将应用程序设计为正确使用异常并正确处理它们,那么您的服务“出于某种原因”就不应该出现问题。

其他

您是否无法确定“无需工作”和挂起之间的区别?

答案 1 :(得分:0)

您可以使用.net中的 ServiceController 类来监控服务。

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

我使用以下方法来监控我的服务。

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

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

  • 然后我又创建了一个通知服务,它会收听 特定事件的事件查看器,从中读取消息 活动录入
  • 如果事件条目属于事件查看器,它将发送邮件 通过smtp通知
  • 如果您没有提供smpt,那么请转到Windows应用程序 使用气球或消息收听事件并显示消息 框

答案 2 :(得分:-1)

适用于此项目的解决方案是使用类似心跳的实现,以允许服务通知我它的可用性。

因为我们的应用程序使用WebAPI,所以我能够设置一个端点,服务每隔[x]秒“ping”一次。

已添加一个单独的进程,该进程检查来自服务的最后一次通知的日期和时间,如果不在设置的阈值内,则通知用户该服务不可用。

我查看了使用 ServiceController ,但这不是一个理想的解决方案,因为添加到服务的功能可能作为Windows运行控制台应用程序而不是Windows服务。