gpt4 book ai didi

c# - Windows NT 服务关闭问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:40 24 4
gpt4 key购买 nike

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

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

基本上,我的应用程序被迫崩溃和燃烧,远程过程调用失败,并最终在超时期限(似乎大约为 20-30 秒)后被操作系统强制终止。

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

我试过:

通过 p/invoke 调用 SetProcessShutdownParameters 以尝试尽快通知我的应用程序关闭,以避免 Redirector 在我关闭之前关闭。

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

调整 WaitToKillServiceTimeout

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

但最后,我仍然有大约 30 秒的问题时间,在这段时间内我的服务似乎还没有收到 OnShutdown 事件的通知,但由于重定向器不再为我的网络共享请求提供服务,请求失败了.

如何解决这个问题?我可以做些什么来延迟或停止关闭,或者至少允许关闭我的事件任务而不让重定向器服务从我下面消失?我可以理解 Microsoft 正在尝试做什么来防止服务拖延和显示关闭,但这似乎是 Windows 客户端操作系统的一个伟大目标,而不是服务器。我不希望我的服务器快速关闭,我想要操作完整性和正常关闭。

在此先感谢您提供的任何帮助。

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

最佳答案

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

关于c# - Windows NT 服务关闭问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2696701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com