Windows NT服务关闭问题

时间:2010-04-23 06:40:12

标签: c# windows-services middleware system-shutdown

我开发了中间件,为组织内多个平台上的多个客户端应用程序提供RPC功能。中间件是用C#编写的,并作为Windows NT服务运行。它处理文件访问网络共享,数据库访问等问题。中间件托管在运行Windows Server 2008的两个高端系统上。

当我们的某个服务器管理员重新启动计算机时,主要是为了执行Windows更新,系统在NT服务方面的行为方式存在严重问题。我的服务旨在立即停止侦听新连接,立即开始拒绝现有连接上的新请求,以及在SCM发出OnStop或OnShutdown请求时尽快关闭。但是,为了保持系统完整性,允许当前正在进行的操作持续合理的时间。通常服务器会在30秒内关闭(例如,当手动停止服务时)。但是,当系统被指示重新启动时,我的服务立即失去对网络驱动器和UNC路径的访问权限,从而导致任何打开文件的数据完整性问题以及对这些位置的部分写入。我的服务确实将Workstation(以及SMB重定向器)列为依赖项,因此我认为如果Windows正在尊重这些依赖项,则在停止Workstation / Redirector之前需要停止我的服务。

基本上,我的应用程序被迫崩溃和刻录,远程过程调用失败,并且最终在超时时间过后被强制终止(似乎是大约20-30秒)。

与Windows应用程序不同,我的Windows NT服务似乎没有任何权力来阻止正在进行的系统关闭,延迟系统关闭,甚至只有机会在强行之前保存任何待处理的网络共享磁盘写入断开连接并关闭。 NT Service开发人员如何在这种环境中拥有任何类型的应用程序完整性?为什么Forms Applications在关闭之前获得了完成业务的所有机会,而服务似乎没有获得这样的好处?

我试过了:

通过p / invoke调用SetProcessShutdownParameters尝试更快地通知我的应用程序关闭,以避免重定向器在关闭之前关闭。

使用小于或等于两分钟限制的值调用ServiceBase.RequestAdditionalTime。

调整WaitToKillServiceTimeout

我能想到的一切都能让我的服务更快地关闭。

但最终,我仍然得到约30秒的问题时间,我的服务似乎甚至没有收到OnShutdown事件的通知,但由于重定向器不再为我的网络共享请求提供服务,请求失败

这个问题是如何解决的?如果没有重定向器服务从我身下消失,我该怎么做才能延迟或停止关机,或者至少可以关闭我的活动任务?我可以理解微软正在努力防止服务拖延并显示关机,但这似乎是Windows客户端操作系统的一个伟大目标,而不是服务器。我不希望我的服务器快速关闭,我希望操作完整性和优雅的关闭。

提前感谢您提供的任何帮助。

更新:我已经完成了确切的时间安排。在测试关闭时,我在23:55:58收到了关机通知,并注意到在23:56:02失去了网络共享连接。所以在四秒钟内,我失去了保存任何活动状态的能力。

1 个答案:

答案 0 :(得分:1)

这个问题:ServerFault上的https://serverfault.com/questions/34427/windows-service-dependencies应该自己回答。它链接到这篇文章:http://blogs.technet.com/askperf/archive/2008/02/04/ws2008-service-shutdown-and-crash-handling.aspx,它可以帮助您获得关闭前通知和服务关闭顺序。