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

本文关键字:方法 挂起 服务 是否 检查 | 更新日期: 2023-09-27 18:16:10

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

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

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

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

有什么建议我可以去监控这个吗?有人有过类似的工作经验吗?

谢谢,米

编辑1 让我们粗略地了解一下该服务的工作原理:当有新的/更新的数据可用时,第三方服务会引发事件,因此我的服务会等待这些事件被引发,并处理在引发的事件中返回的数据。因此,这就是为什么识别"没有更改"比识别"服务崩溃"更棘手的原因。

编辑2 我认为我需要更清楚地说明一下:进行这种监视的主要原因是通知用户有关服务或与第三方服务的连接的潜在问题。该服务本身是单线程的,并具有适当的异常处理和日志记录。很有可能这个服务将在某个服务器上运行,所以如果服务出现任何问题,并且由于任何原因它停止更新我们的本地数据存储,那么服务需要通知某人。

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

您可能需要考虑类似'heartbeat'的东西:

Windows Service的Heartbeat活动

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

Windows本身也有多种方法来帮助:

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

如果你设计你的应用程序正确地使用异常并适当地处理它们,你应该永远不会遇到服务'由于某些原因挂起'的问题。

附加:

你没有办法确定"不需要工作"answers"挂"之间的区别吗?

你可以在。net中使用ServiceController类来监控服务。

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

我使用下面的方法来监视我的服务。

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

custom-eventid | datetime |消息

    然后我又创建了一个通知服务,它将监听的事件查看器中读取消息事件条目
  • 如果事件条目落在事件查看器中,它将发送邮件smtp
  • 通知
  • 如果你没有提供smpt,那么去windows应用程序哪个监听事件并使用气球或消息显示消息框

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

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

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

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