我们有一些用 .NET 编写的 Windows 服务。它们可以在服务 mmc 中手动启动,但尽管设置为自动,它们在启动(或重新启动)机器时永远不会启动。
更新在事件日志中,我没有看到“xyz 已启动”以及其他所有正在启动的服务,而只看到“xyz 服务已进入停止状态。”以及一个单独的错误,提示“等待来自 slsvc 服务的事务响应时超时(30000 毫秒)。”。
如果我手动启动它们,那么我会按预期在事件日志中获得正常条目,并且一切都很好 - 直到下一个 Windows 更新补丁强制重新启动并且所有服务再次关闭。
有什么想法吗?我尝试将它们设置为延迟启动,但没有明显区别。
答案1
有一个解决方案。请参阅:http://support.microsoft.com/kb/922918
问题是,服务可能需要 ldap 或其他远程访问,因此会遇到延迟。这种情况在服务器启动时尤其可能发生。通过延长延迟,您可以确保服务能够启动。
当然,更好的办法是解决此服务启动时间过长的问题。您的环境是否不够大?您是否遇到了服务延迟启动而导致的服务性能问题?
答案2
您说“我们有一些 Windows 服务”是什么意思?这是否意味着它们是由贵组织内部的某个人创建的?如果是这样,那么您比这里的任何人都更有能力调试它们 - 这些服务对 Windows 组件有哪些依赖关系,您的程序员是否考虑过测试这些服务的可用性并等待它们在您的服务启动时上线?
您是否考虑过将这些服务设置为软件许可服务的依赖项(这就是韋斯萊夫是)?
从http://support.microsoft.com/kb/193888
要创建新的依赖关系,请选择代表要延迟的服务的子项,单击“编辑”,然后单击“添加值”。创建一个新值名称“DependOnService”(不带引号),数据类型为 REG_MULTI_SZ,然后单击“确定”。出现“数据”对话框时,键入您希望在此服务之前启动的服务的名称(每行一个条目),然后单击“确定”。
您在数据对话框中输入的服务名称是该服务在注册表中的服务项下显示的准确名称。
当计算机启动时,它会使用此条目来验证此值中列出的服务是否已启动,然后再尝试启动相关服务。
答案3
尝试一下这个:
运行以下命令来定义适合您环境的触发事件。在此示例中,该命令确定是否为主机分配了 IP 地址,然后启动或停止服务。
sc triggerinfo w32time 启动/networkon 停止/networkoff
其中 w32Time 是您的服务名称
或者尝试一下
答案4
Microsoft Windows 服务控制管理器控制所有已安装 Windows 服务的状态(即已启动、已停止、已暂停等)。默认情况下,服务控制管理器将等待 30,000 毫秒(30 秒)让服务响应。某些配置、技术限制或性能问题可能会导致服务启动并向服务控制管理器报告准备就绪的时间超过 30 秒。
通过编辑或创建 ServicesPipeTimeout DWORD 值,可以覆盖服务控制管理器超时期限,从而为服务提供更多时间启动并向服务报告准备就绪状态。
怎样做?
- 转到“开始”>“运行”> 并输入 regedit
- 导航到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
- 选择控制文件夹后,右键单击右侧窗格并选择新的 DWORD 值
- 将新的 DWORD 命名为:ServicesPipeTimeout
- 右键单击 ServicesPipeTimeout,然后单击修改
- 单击“十进制”,键入“180000”,然后单击“确定”
- 重启计算机
笔记:上述建议将超时时间增加到 180,000 毫秒(3 分钟),但根据您的环境,可能需要进一步增加超时时间。请记住,增加此值可能会导致服务器启动时间更长。