5

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

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

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

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

关于如何监控这个有什么建议吗?有人有过类似的工作经验吗?

谢谢,米

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

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

4

3 回答 3

5

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

Windows 服务的心跳活动

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

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

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

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

额外的:

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

于 2013-05-31T10:59:11.790 回答
0

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

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

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

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

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

  • 然后我创建了另一个通知服务,它将监听特定事件的事件查看器,从事件条目中读取消息
  • 如果事件条目落在事件查看器中,它将通过 smtp 发送邮件通知
  • 如果您没有提供 smpt,那么请使用 Windows 应用程序,它会监听事件并使用 baloon 或消息框显示消息
于 2013-05-31T12:22:28.160 回答
-1

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

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

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

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

于 2013-06-06T10:06:14.733 回答