Windows故障恢复与失败次数的机制及配置疑问
嘿,这个问题抓得很准!我来给你把Windows服务故障恢复和失败次数的联动逻辑拆明白,结合你用notepad2.exe测试的场景来讲更直观。
Windows服务故障恢复与失败次数的运作机制
1. 服务控制管理器(SCM)的失败计数逻辑
Windows的SCM会给每个注册的服务维护一个失败计数器:
- 每当服务发生意外终止(比如崩溃、异常退出、非预期的停止,不是你手动执行
sc stop这种正常停止操作),计数器就会+1 - 只要服务连续稳定运行满指定时长(默认24小时),这个计数器会自动清零——相当于SCM认为服务已经恢复正常,之前的失败记录不算数了。这个时长你可以通过配置修改。
2. Actions数组与失败次数的精准对应
你提到的微软文档里的Actions字段是核心,这个数组元素用[~]分隔,和失败次数的对应关系非常明确:
- 数组的第N个元素,就对应服务第N次失败时SCM要执行的操作
- 如果失败次数超过了数组的长度,SCM会一直重复执行数组的最后一个元素的操作
举个你用notepad2.exe的实际配置例子:
假设你执行了这条命令:
sc failure notepad2 reset= 86400 actions= restart/5000[~]restart/10000[~]run/0/cmd.exe
这里的参数解释下:
reset= 86400:表示服务连续运行24小时(86400秒)无失败,计数器清零actions里的restart/5000:第一次失败时,延迟5秒重启服务;restart/10000:第二次失败时,延迟10秒重启;run/0/cmd.exe:第三次及以后失败时,立即执行cmd.exe
那实际运作流程就是:
- 第一次
notepad2.exe崩溃,SCM触发第一个动作:等5秒重启它,失败计数器变为1 - 如果重启后又崩溃,计数器变为2,SCM触发第二个动作:等10秒再重启
- 第三次崩溃,计数器变为3,SCM触发第三个动作:执行
cmd.exe;之后如果再崩溃,就一直重复执行cmd.exe,直到服务正常运行满24小时,计数器清零,回到初始状态。
3. 容易踩坑的细节
- 什么才算“失败”:只有服务的终止状态被标记为异常(比如退出码非0、程序崩溃、被外部强制终止)才会触发计数。手动正常停止服务不会触发。
- 重置时长可自定义:
reset=后面的数值是秒数,你可以改成更短的时间,比如reset= 3600就是1小时后清零计数器。 - 操作类型有三种:除了
restart和run,还有none——也就是失败后SCM不做任何操作。
内容的提问来源于stack exchange,提问作者OldSchool




