任务计划程序替代方案
任务计划程序执行命令,但没给你一份可运维的调度。
Dagu 可以注册为 Windows 服务,补齐任务计划程序从未具备的部分:作业之间的依赖、重试、按步骤的日志、运行历史,以及一个覆盖所有服务器的浏览器控制台,而不是逐台远程桌面。
# nightly-close.yaml
schedule: "0 2 * * *"
max_active_runs: 1
shell: powershell -NoProfile
steps:
- id: export
run: .\scripts\Export-Sales.ps1
retry_policy:
limit: 2
interval_sec: 300
- id: transform
run: .\scripts\Transform-Sales.ps1
depends: export
- id: load
run: .\scripts\Import-ToCore.ps1
depends: transform
handler_on:
failure:
run: .\scripts\Notify-Failure.ps1
mail_on:
failure: true注册为 Windows 服务
支持 PowerShell、pwsh 与 cmd.exe
作业定义是受版本控制的 YAML
一个 Web 控制台覆盖所有服务器
At a glance
Windows Server 上的任务计划程序与 Dagu
用 depends 声明;失败会阻止下游步骤。
没有。用启动时间近似表达顺序。
重试、恢复处理器与邮件通知。
一个由人查看的上次运行结果代码。
在 Git 中评审的 YAML,可部署到任意主机。
逐台机器的图形界面配置,可导出为 XML。
带运行历史与按步骤日志的浏览器控制台。
每台服务器本地的 MMC 管理单元与事件日志。
In depth
Where each tool fits
用时钟表示的顺序不是依赖
任务计划程序在指定时间触发任务。它没有“一个任务等待另一个任务”的概念,因此团队只能靠估算耗时、拉开启动时间来表达顺序。
- 无论 02:00 的任务是否成功,02:30 的任务照常运行,并且通常直接使用它留下的东西
- depends 直接声明顺序,上游失败时下游不会运行,也就不会处理损坏的数据
- 真正相互独立的作业可以并行,而不必出于谨慎而错开
会主动报告的失败
失败的计划任务只会设置一个上次运行结果代码,然后等人来看。多数团队是在第二天早上,从数据下游的同事那里得知的。
- retry_policy 在惊动任何人之前先重试可恢复的失败
- handler_on.failure 执行恢复作业,mail_on 负责发送通知
- 每次运行都按步骤保留 stdout 和 stderr,而不是只有一个返回码和事件日志里的零星记录
可以评审的定义,可以随处访问的控制台
任务计划程序的定义存在于某一台机器的图形界面里。导出得到的 XML 没人会去评审,而检查十台服务器意味着十次远程会话。
- 工作流是 Git 中的 YAML,调度变更成为一次 Pull Request,测试与生产可以持有同一份定义
- Web UI 从任意浏览器展示当前与历史运行,无需逐台建立 RDP 会话
- PowerShell、pwsh 和 cmd.exe 都可用,现有脚本无需改动即可迁移
FAQ
Practical questions before adopting Dagu
Dagu 能作为 Windows 服务运行吗?
可以。PowerShell 安装程序可以使用版本固定的 WinSW 包装器将其注册为 Windows 服务,随机器启动,并像其他服务一样可被 Get-Service 看到。Windows 版本提供 amd64、386 和 arm64 构建。
现有的 PowerShell 和批处理脚本还能用吗?
能。步骤通过 PowerShell、pwsh 或 cmd.exe 执行命令,可按工作流或按步骤选择。未配置 shell 时,Dagu 依次优先 PowerShell、pwsh、cmd.exe。调用方式与任务计划程序相同。
一个 Dagu 能管理多台 Windows 服务器上的作业吗?
可以,有两种方式。Worker 可以运行在其他机器上并从 coordinator 接收任务;远程节点则让一个 Web UI 在多个独立的 Dagu 部署之间切换。两种方式的控制台都是浏览器而非远程桌面。
支持哪些 Windows 版本?
Windows Server 2019 及更高版本是稳妥的目标。缺少 AF_UNIX 支持的旧版本仍可执行工作流,但实时状态与停止控制的套接字不可用,Dagu 会记录警告并在没有该功能的情况下继续运行。
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.