繁体   English   中英

检查Windows服务是否已被强制关闭或崩溃

[英]Check if windows service has been forcefully shut down or crashed

我有一个用C#.NET Framework 3.5编写的Windows服务,并且想知道检查服务以前关闭是否正常的最佳方法。

启动服务后,应检查上次关闭是否正常(通过服务管理中的“停止服务”按钮)或是否有人刚刚终止了该进程(或由于某种原因导致崩溃而未直接链接到服务本身)。

我考虑过在启动服务时在硬盘上写入加密的XML,然后在停止服务时使用一些值对其进行编辑。 这样,下一次再次启动服务后,我可以检查XML并查看关闭期间是否以正确的方式对值进行了编辑,如果不是,我将知道进程已终止或崩溃。

这种方法似乎不太可靠,也不是一个好的做法。 你有什么建议?

说明:服务的作用是它位于服务器上,并侦听来自客户端计算机的连接。 建立连接后,它将通过Web服务与远程数据库进行通信,并确定它们是否有权连接(并因此使用作为调用方的应用程序)。 保护的方面之一是并发检查,如果我将限制设置为5个工作站,则我将TcpClient连接保持从Windows服务到例如5个工作站的活动状态,而第6个工作站无法连接。

如果我终止服务进程并重新启动它,则连接消失了,并且在工作站上运行了5个“许可”应用程序,现在有5个空闲连接插槽可供5个以上的空闲插槽使用。

我也看不到任何使用文件的错误。 您甚至可以使用此文件来记录更多信息。

例如。 您可以附加到AppDomains Unhanded Exception事件并尝试记录该异常。 或者,您可以评估服务运行/未运行日志的方式(为该任务解析日志文件会有点困难)。

当然-这不是不使用日志文件的借口。

最后,我进行了以下处理:该服务用于检查已连接的工作站是否存在,但是现在我还从所有工作站中进行了定期检查(它们通过一个公用路由器dll连接,已在支票中建立)。 每隔10秒钟验证一次连接,如果没有连接,客户端将尝试在15秒钟内重新连接,如果只是暂时的网络问题,它将成功,但是如果强制关闭服务,则失败(因为所有它的Tcp对象将丢失)。

我建议使用EventLog 在服务启动或停止时添加日志事件,并通读事件日志以检测异常。

这是CodeProject的基本示例。 这是MSDN演练,介绍如何创建/删除/读取事件日志和条目。

除非服务正在运行某种需要安全的“防篡改”系统的安全系统,否则我不明白为什么使用文件不是一个好的解决方案。

就个人而言,我认为加密的xml文件是多余的,一个简单的文本文件就足够了。

我认为您走在正确的道路上,我不确定为什么要编辑这些值,仅使用文件(或注册表项)作为标记来指示该服务已启动并正在运行。 在正常关机期间,删除标记。 然后,您只需要查找标记的存在即可知道您是正常关闭还是崩溃。

如果发现文件创建不可靠,请确保关闭,刷新和处置文件对象,而不要依赖垃圾回收器。

---澄清后进行编辑---

因此,要求的是许可系统,而不仅仅是确定服务是否正常关闭。 我猜想是希望在正常关闭时清除“许可证”并在崩溃后将其还原,这种情况是可以互换的。

我可能会使用具有适当安全性的数据库后备存储来将许可证密钥保存在服务器上。 当每个客户端连接并请求许可证时,将为它们提供一个密钥,该密钥必须针对客户端的每次通信提供。 服务器显然正在验证所提供的密钥对当前会话有效。 如果服务器正常关闭,则可以清除密钥表,如果崩溃,则密钥仍然存在并且可以兑现。 我认为这可能是最安全的最简单方法。

如果故事还有更多内容,请告诉我们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM