为什么 Windows 任务计划程序会生成相互运行的同一任务的多个实例?

为什么 Windows 任务计划程序会生成相互运行的同一任务的多个实例?

概述:

我使用 Windows 任务计划程序来运行自动化任务。偶尔我会发现某个任务随机未能完成其任务。当我检查任务计划程序以查看历史记录中发生了什么时,我发现出于某种原因,当任务按计划触发时,它们会同时生成多个实例,这会给任务带来灾难,它要么杀死其他实例并尝试运行“第一个”实例,要么根本不运行,因为它认为自己的另一个实例已经在运行。有时这种情况发生在相同的任务中,有时也会发生在其他任务中。解决方法是结束所有实例并手动启动任务。

问题:

为什么具有单一计划的单一任务会决定同时生成其自身的多个实例?

笔记:

我设置了一个单独的用户帐户来代替我自己运行任务。该用户确实是运行任务的计算机上的管理员,并且任务设置为无论用户是否登录都可以进行调整。此外,该计算机是 Windows Server 08 R2。

答案1

任务调度程序有一个已知错误,会导致它不时运行同一任务两次。当上一个计划任务恰好在新任务应该开始时终止时,就会发生这种情况:调度程序将运行同一任务两次。

那里有一个可用的修补程序: http://support.microsoft.com/kb/2461249

当我们遇到该问题时,我们只需减少任务运行频率即可解决它。

答案2

我在 Windows Server 2012 R2 上遇到了这个问题,该机器托管一项计划任务,该任务每 15 分钟运行一次,负责将文件从 SFTP 服务器移出。

重复实例已经出现了一段时间,我刚刚才找到解决办法。

我将计划任务包装在 PowerShell 启动进程命令中,并使用互斥锁在线程上提供阻止,确保只有我的任务的单个实例可以运行。

下面是我在代码中实现的方法

# Start mutual exclusion
$Mutex = New-Object -TypeName System.Threading.Mutex -ArgumentList $false, "Global\**MyMutexName**"
$Mutex.WaitOne() | Out-Null

    ***..... Rest of my code here .....***

#Release the mutal exclusion
$Mutex.ReleaseMutex() | Out-Null

我还更新了计划任务操作以启动我的 powershell 脚本并传递 -sta 参数以在启用 sta 模式的情况下启动。

我确实看到通过任务调度程序历史记录产生了多个实例,它们都有不同的关联ID,但其中一个启动失败,而另一个成功完成。

计划任务历史记录截图

我确实希望这个答案能够对将来的某些人有所帮助,因为我已经花了好几个月的时间试图找到解决这个问题的办法!

答案3

如果任务调度程序认为第一次启动不成功,则有一个选项可以重新启动任务。如果设置了该选项,最好将其禁用。接下来应该进一步检查为什么第一次启动返回不成功的值。

您能否发布您正在启动的具体内容,如果它是某种脚本,请也包括脚本的源代码?

答案4

我有几个这样的任务似乎几乎在同一时刻多次出现。其他的则没有。我是这样解决的:

1)转到任务属性

2)在“设置”选项卡上,确保底部的项目 - “如果任务已在运行,则适用以下规则:”

3)设置为-“不启动新实例”

最后,它表现得像一个不错的小任务,只在我想要的时候运行一次。好任务。你得到了饼干。

相关内容