当前位置: 首页 > 知识库问答 >
问题:

Windows任务计划程序错误地为每个触发器生成多个实例(但需要能够并行运行多个实例)

濮景龙
2023-03-14

我通过Windows任务计划程序(操作系统:64位Windows Server Standard with SP2)将任务设置为每30分钟运行一次可执行文件。此任务需要能够同时运行自身的多个实例,因此选择了此设置:“如果任务已经在运行,则应用以下规则:并行运行新实例”。(原因:该任务处理队列表中的记录,该队列表可能为空或包含数十万条记录。每个任务实例都保留一大块记录来处理,所以实例不会冲突)

问题是,该任务在每个触发间隔生成多个 NEW 实例。它每 30 分钟只触发一个新实例。通常,它会生成 2、3、4 个或更多新实例。此时,可执行文件可以处理重复的新实例而不会出现重大错误,但是服务器正在做比它需要的更多的工作,并且它只是让我烦恼,直到任务计划程序以这种方式行为异常。以下是我到目前为止尝试修复的问题:

  • 已删除并重新创建任务(多次)。
  • 重新启动服务器。
  • 已安装此修补程序:http://support.microsoft.com/en-us/kb/2461249
  • 设置为无限期每30分钟运行一次。
  • 设置为每天每30分钟运行一次,持续一天。
  • 将“跨时区同步”设置为true
  • 设置“以最高权限运行”=true
  • 设置“延迟任务最多[X]秒的随机延迟”=false(在同一秒内生成多个新实例)
  • 将“延迟任务最多随机延迟[30]秒”=真(不是在同一秒内触发,而是在30秒内触发多个新实例)
  • 设置“如果任务失败,每1分钟重新启动一次”=真
  • 设置“如果任务失败,每1分钟重新启动一次”=false
  • 设置“错过预定启动后尽快运行任务”=false(如果设置为true,问题会更严重)

更令人费解的是:此服务器上的一些其他任务具有相同或类似的设置,并且没有此问题。他们在修补程序之前就有这个问题,但修补程序之后就很少了。除了这个任务。究竟是什么问题?

导出的任务设置如下(XXXX替换敏感信息)。我将这一点与另一个没有问题的类似任务进行了比较。唯一的区别是:工作任务有不同的作者,不同的exe文件,每5分钟运行一次,而不是每30分钟运行一次。

我打算把这记为微软某天需要修复的一个bug,但在放弃之前,我想我应该在这里提出来进行审查。

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-08-27T10:09:33.7980839</Date>
    <Author>XXXX\XXXX</Author>
    <Description>Links newly downloaded images to products. Resizes and uploads different sizes to XXXX. Updates relevant tables. Logs errors.</Description>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT30M</Interval>
        <Duration>P1D</Duration>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2015-02-11T19:06:00Z</StartBoundary>
      <Enabled>true</Enabled>
      <RandomDelay>PT30S</RandomDelay>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>XXXX\XXXX</UserId>
      <LogonType>Password</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <IdleSettings>
      <Duration>PT10M</Duration>
      <WaitTimeout>PT1H</WaitTimeout>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle> 
    </IdleSettings>
    <MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>true</WakeToRun>
    <ExecutionTimeLimit>P1D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\XXXX\XXXX\XXXX.exe</Command>
    </Exec>
  </Actions>
</Task>

共有1个答案

蒙奇
2023-03-14

我在同一条船上,有一个任务发射了3次,另一个发射了9次。但也有一群像预期的那样只开了一枪。安装修补程序后问题仍然存在。

在我所有的研究都没有发现好的线索之后,我的下一步将是与微软展开支持案例。在这样做之前,我想我会尝试删除并重新创建任务,因为我已经安装了补丁。我开始只删除并重新创建触发器(设置为每天运行一次),并将其设置为不同的时间。对了,我的问题解决了!

所以我不知道关键是什么,它是在安装补丁后删除和重新创建触发器,还是正在改变时间,但两者都有效。

希望这有帮助!

 类似资料:
  • 我试着用一个实例并行运行许多计划任务,每一个我这样配置任务 但是有很多实例每秒开始,而第一个实例尚未完成。是否可以同时配置任务运行的一个实例?我的豆子配置在Spring调度器.xml

  • 我正在使用 Kubernetes 作为容器编排器构建一个微服务应用程序。该应用程序现已启动并运行,但我有其他问题。那是在我的服务中,我每天都有一个计划任务运行,当服务部署时,将运行多个服务实例(通过设置副本编号),创建多个同时运行的任务。我期望的是只有一个服务任务实例将运行,而不是多个实例。有什么技术可以处理这种情况吗? 库伯内特斯 Asp.net核心构建微服务 CI/CD的基岩实现 Fabrik

  • 自 1.5 后就过时了 在 Hangfire 1.5 之后,您不需要额外的配置来支持多个服务实例处理同一个后台任务,可以跳过本文了。现在使用 GUID 生成服务器标识符,因此所有实例名称都是唯一的。 可以同时在一个程序、机器或多台机器上运行多个服务器实例。每个服务实例使用分布式锁来执行协调逻辑。 在上述情况中,每个Hangfire服务器都有一个唯一的由两部分组成的供默认值标识符。最后一部分是一个程

  • 我们有一个Spring Boot应用程序,并有计划的任务。 我们希望在多个服务器上部署我们的应用程序,因此将有多个应用程序实例。 如何将 Spring 配置为仅在指定的服务器上运行计划任务?

  • 我们有一个spring boot应用程序和计划任务。 我们希望 在多个服务器上部署我们的应用程序 ,因此应用程序的多个实例。 如何配置spring在同时运行的多个实例上运行调度任务? 例如:一个应用程序在上午12点部署在第一个服务器实例中,任务计划在12点运行。同一个应用程序部署在第二个服务器实例中,时间为凌晨12点03分,由于部署任务存在差异,因此也在凌晨12点33分开始执行相同的cron表达式

  • 我正在将Vue集成到一个表单网站上,这意味着如果页面上有多个表单,我必须创建Vue应用程序的几个实例。所有实例共享相同的Vuex存储。 我创建了一个Vuex模块,这样每个Vue实例都可以有自己的本地状态。我的主要目标是防止一个Vue实例更新另一个Vue实例的状态。 这是我的Vuex模块 创建我的Vuex实例: 我正在阅读Vuex文档,它说你需要使用一个返回模块状态的函数,这就是我正在做的。但是,当