You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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小时后清零计数器。
  • 操作类型有三种:除了restartrun,还有none——也就是失败后SCM不做任何操作。

内容的提问来源于stack exchange,提问作者OldSchool

火山引擎 最新活动