2013-05-31 38 views
5

我有关于如何最好地检查服务是否仍在运行的问题。检查服务是否挂起的最佳方法

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

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

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

有没有关于如何去监控这个的建议?任何人都有类似的工作经验吗?

感谢,男

编辑1 只给的服务是如何工作的一个粗略的想法:第三方服务引发事件时,新的/更新的数据是可用的,所以我的服务坐着等待这些事件以提高和处理在募集事件中返回的数据。因此,这就是为什么识别何时“没有变化”而不是“服务崩溃”的棘手问题。

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

+0

你的服务是否有某种轮询循环? –

+0

你能告诉我们你的服务实际上做了什么吗?我们可以帮助确定一个位置来定位某种形式的心跳。 – KingCronus

回答

-1

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

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

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

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

4

你可能要考虑的东西像一个“心跳”:

Heartbeat activity for Windows Service

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

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

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

如果你设计你的应用程序能够正确使用异常,并适当地处理它们,你不应该曾经有与您的服务“为挂一个问题一些原因'。

附加:

难道就没有办法为你决定“没有工作需要”和悬挂之间的区别?

+0

最糟糕的是,如果服务是多线程的,活锁或死锁正在发生。 –

+0

@MthetheWWatson是的,心跳可能会有所帮助,但我仍然想要考虑根本原因。几乎总是可以使用适当的线程安全编程来纠正死锁和活锁。 – KingCronus

0

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

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

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

  • 第一件事情,我记录的所有信息,从我的服务错误事件查看器中这样

定制事件ID的标准格式|日期时间|消息

  • 然后我创建了另一个通知服务,该服务将收听针对特定事件的 事件查看器,从 事件条目
  • 中读取消息
  • 如果事件条目在事件查看器落在它会通过SMTP
  • 发送邮件 通知,如果你不具备SMPT然后去这听活动Windows应用程序 和使用气球或消息 框显示消息
相关问题