【问题标题】:Best way to check if a service has hung检查服务是否已挂起的最佳方法
【发布时间】:2013-05-27 04:16:53
【问题描述】:

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

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

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

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

对于我如何进行监控有什么建议吗?有没有人有过类似的工作经验?

谢谢,M

编辑 1 只是大致了解服务的工作原理:当新的/更新的数据可用时,第 3 方服务会引发事件,因此我的服务会等待这些事件被引发并处理引发事件中返回的数据。因此,这就是为什么很难确定何时“没有变化”而不是“服务崩溃”。

编辑 2 我想我需要更清楚一点:此监控的主要原因是通知用户有关服务或与第 3 方服务连接的潜在问题。该服务本身是单线程的,并具有适当的异常处理和日志记录。该服务很可能会在某处的服务器上运行,因此如果该服务出现任何问题,并且无论出于何种原因该服务需要通知某人,它都会停止更新我们的本地数据存储。

【问题讨论】:

  • 您的服务是否有某种轮询循环?
  • 您能否向我们展示您的服务实际功能的伪大纲?我们可以帮助确定放置某种形式的心跳的位置。

标签: c# service monitoring


【解决方案1】:

您可能需要考虑类似“心跳”之类的东西:

Heartbeat activity for Windows Service

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

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

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

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

补充:

你有没有办法确定“不需要工作”和挂起之间的区别?

【讨论】:

  • 最糟糕的是如果服务是多线程的并且正在发生活锁或死锁。
  • @MatthewWatson 是的,心跳可能对此有所帮助,但我仍然想考虑根本原因。死锁和活锁几乎总是可以使用适当的线程安全编程来纠正。
【解决方案2】:

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

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

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

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

custom-eventid|datetime|message

  • 然后我又创建了一个通知服务来监听 特定事件的事件查看器,从 活动入口
  • 如果事件条目落在事件查看器中,它将发送邮件 通过 smtp 通知
  • 如果您没有提供 smpt,请使用 windows 应用程序 监听事件并使用气球或消息显示消息 盒子

【讨论】:

    【解决方案3】:

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

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

    添加了一个单独的流程,该流程检查来自服务的最后一次通知的日期和时间,如果未在设定的阈值范围内,我会通知用户该服务不可用。

    我曾考虑使用 ServiceController 但这不是一个理想的解决方案,因为添加到服务的功能可能会以 Windows 的形式运行控制台应用程序而不是 Windows 服务。

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      相关资源
      最近更新 更多