【发布时间】:2011-03-30 12:48:47
【问题描述】:
我编写了一个 Windows 服务,它在 Windows 2000 机器上运行。有时该服务的可执行文件会死掉,但 Windows 服务在服务管理器中仍列为“已启动”。在这种情况下,为该服务定义的重启行为不会生效。
当然,该过程需要调试,但我现在正在寻找解决方法。
如何避免这种情况? Windows 2000 中的服务管理器如何确定 Windows 2000 进程是否仍在启动?
【问题讨论】:
我编写了一个 Windows 服务,它在 Windows 2000 机器上运行。有时该服务的可执行文件会死掉,但 Windows 服务在服务管理器中仍列为“已启动”。在这种情况下,为该服务定义的重启行为不会生效。
当然,该过程需要调试,但我现在正在寻找解决方法。
如何避免这种情况? Windows 2000 中的服务管理器如何确定 Windows 2000 进程是否仍在启动?
【问题讨论】:
这可能意味着服务崩溃了。 IIRC,当服务进程异常终止时,旧版本的 Windows 并不总是恢复。但那是很多年前的事了,我的记忆可能有问题。
避免这种情况的最佳方法是找出导致服务崩溃的原因并修复它。
【讨论】:
SERVICE_CONTROL_INTERROGATE 是否可以让 SCM 指出相关服务进程已终止这一事实?
虽然 Larry 作为 Microsoft 员工,可能比任何人都清楚,但我敢说你应该给ChangeServiceConfig2 和SERVICE_CONFIG_FAILURE_ACTIONS 一个机会。我从事过一项遗留服务,在我进行重构之前,该服务经常崩溃。我的前辈选择的补救措施是使用失败操作来调用一个程序(在 SYSTEM 下运行)然后重新启动服务,就好像什么都没发生一样。
只有当您的服务在其自己的进程中运行时,所有这些才有效,根据您描述它的方式,我假设了这一点。如果您的服务是在 DLL 中实现的,这将不起作用。
但我完全同意拉里的观点,即您应该调查并解决问题,而不是试图隐瞒。如上所述,我修复了有问题的服务,它没有崩溃或很少崩溃,每个人都对这个解决方案更满意;)
【讨论】: