用于调度代码重复运行的 Windows 任务调度程序有多可靠?

Posted

技术标签:

【中文标题】用于调度代码重复运行的 Windows 任务调度程序有多可靠?【英文标题】:How reliable is windows task scheduler for scheduling code to run repeatedly? 【发布时间】:2010-10-17 21:14:26 【问题描述】:

我有一些代码需要放在 Windows Server 2003 机器上,并且每分钟运行一次。

推荐的处理方法是什么?可以将其设计为控制台服务并让任务调度程序每分钟都击中它吗? (这甚至可能吗?)我应该把它吸收起来并将其编写为 Windows 服务吗?

【问题讨论】:

【参考方案1】:

由于它需要每分钟运行一次,我建议编写一个 Windows 服务。这不是很复杂,如果您以前从未这样做过,那么您最好了解一下它是如何完成的。

我不建议每分钟调用一次计划任务。

【讨论】:

如果 Windows 服务每分钟运行一次,你为什么推荐它而不是任务计划程序?是什么让你选择这个选项?【参考方案2】:

我会说把它收拾起来,然后把它写成一个 Windows 服务。我还没有发现计划任务非常可靠,当它不运行时,我还没有找到一种简单的方法来找出它为什么不运行。

【讨论】:

事件日志应该说明为什么没有。 @jeffamaphone “应该”是关键字。我还发现计划任务不可靠,通常不会在事件日志中留下任何运行尝试的痕迹。【参考方案3】:

Windows 计划任务对于我们的目的来说相当可靠,由于其易于安装和高级恢复功能,我们几乎在所有情况下都喜欢它们而不是 Windows 服务。如果编写的代码的一部分最终被锁定或循环在一段不应包含的代码中,则 Windows 服务的始终在线性质最终可能会成为问题。我们通常将代码编写在类似这样的时尚

Init();
Run();
CleanUp();

然后,作为计划任务的一部分,我们对进程可以运行多长时间设置了时间限制,如果进程运行时间更长,则让它终止该进程。如果我们确实有一段代码出现问题,Scheduled Tasks 将杀死它,该进程将在下一分钟启动。

【讨论】:

【参考方案4】:

如果您需要让它每分钟运行一次,我会将其构建为 Windows 服务。我不会将调度程序用于日常任务之外的任何事情。

【讨论】:

【参考方案5】:

我会说这取决于它在做什么,但总的来说,我总是赞成使用最少的层。如果您将其编写为控制台服务并使用任务调度程序,那么您有两个地方需要维护。

如果您将其编写为 Windows 服务,那么您只有少一个地方可以检查以防出现问题。

【讨论】:

【参考方案6】:

在寻找定期服务帮助时,我遇到了一个非常好的article by Jon Galloway。

如果将 Windows 服务用于计划任务,则会有各种缺点。我同意了。我建议使用任务计划,实现简单。请参考detailed information of implementing the task scheduler。希望这些信息有助于最终确定实施方法。

【讨论】:

【参考方案7】:

唯一需要考虑的另一点是,如果您的工作涉及某种数据库交互,请考虑查看您的数据库提供的集成/调度服务。

例如,为您的 SQL Server 相关服务创建一个 SSIS 包可能看起来有点矫枉过正,但它可以很好地与环境集成,并且已经拥有自己的日志记录/错误检查机制。

【讨论】:

【参考方案8】:

我同意,即使是创建控制台可执行文件并将其安排为每分钟运行一次也是一种浪费。我建议探索Quartz.Net 之类的东西。这样您就可以创建一个简单的作业并安排它每分钟运行一次。

【讨论】:

您似乎反对将任务安排为每分钟运行一次的想法......但是通过 Quartz.Net 来完成的想法?我错过了什么吗?

以上是关于用于调度代码重复运行的 Windows 任务调度程序有多可靠?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

golang协程调度模式解密

用于运行调度程序长时间运行任务的 Web Api 或 WCF

现在可以在从 Windows 任务调度程序运行 .net 核心控制台应用程序时读取 appsettings.json 文件中存在的连接字符串

.jar 文件不适用于 Windows 调度程序

使用 Windows 任务调度程序和 xampp 服务器运行带有 curl 的 php 脚本