タスクスケジューラ 代替
タスクスケジューラはコマンドを実行する。運用できるスケジュールはくれない。
Dagu は Windows サービスとして導入でき、タスクスケジューラに最初からなかった部分を埋めます。ジョブ間の依存関係、リトライ、ステップごとのログ、実行履歴、そしてサーバーごとに RDP する代わりの 1 つのブラウザ画面です。
# 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: trueWindows サービスとして常駐
PowerShell / pwsh / cmd.exe に対応
ジョブ定義はバージョン管理された YAML
全サーバーを 1 つの Web 画面で
一目で比較
Windows Server におけるタスクスケジューラと Dagu
depends で宣言。失敗すると後続が止まる。
なし。開始時刻で順序を近似する。
リトライ、リカバリハンドラ、メール通知。
前回の実行結果コードを人が確認する。
Git でレビューする YAML。任意のホストに配布できる。
マシンごとの GUI 設定。XML でエクスポート可能。
実行履歴とステップごとのログを持つブラウザ画面。
サーバーごとのローカル MMC とイベントログ。
詳細
それぞれの強みと向き不向き
時刻で表した順序は依存関係ではない
タスクスケジューラは指定時刻にタスクを起動します。あるタスクが別のタスクを待つという概念がないため、所要時間を見積もって開始時刻をずらすことで順序を表現することになります。
- 02:00 のタスクが成功したかどうかに関係なく 02:30 のタスクは動き、たいてい前段が残したものをそのまま食べます
- depends は順序を直接宣言するので、前段が失敗したら後続は動かず、壊れたデータが流れません
- 本当に独立しているジョブは、用心のために時間をずらすのではなく並行して走ります
失敗が自分から知らせてくる
失敗したタスクは前回の実行結果コードを立てて、誰かが見に来るのを待ちます。多くの場合それに気づくのは翌朝、データの下流にいる人からの連絡です。
- retry_policy が、人を起こす前に一時的な失敗を retry します
- handler_on.failure がリカバリ処理を実行し、mail_on が通知を送ります
- 実行ごとにステップ単位で標準出力と標準エラーが残ります。結果コードとイベントログに届いた分だけ、ではありません
レビューできる定義と、どこからでも届く画面
タスクスケジューラの定義は 1 台のマシンの GUI の中にあります。エクスポートすると誰も読まない XML になり、10 台のサーバーを確認するには 10 回リモート接続することになります。
- ワークフローは Git 上の YAML なので、スケジュール変更がプルリクエストになり、検証環境と本番が同じ定義を持てます
- Web UI は実行中と過去の実行をブラウザから見せます。サーバーごとの RDP は不要です
- PowerShell、pwsh、cmd.exe がすべて使えるので、既存のスクリプトはそのまま移せます
FAQ
Dagu を導入する前によくある質問
Dagu は Windows サービスとして動きますか?
動きます。PowerShell のインストーラが、バージョン固定された WinSW ラッパーを使って Windows サービスとして登録できます。マシン起動時に立ち上がり、Get-Service からも他のサービスと同じように見えます。Windows 版バイナリは amd64、386、arm64 で提供されています。
既存の PowerShell スクリプトやバッチはそのまま動きますか?
動きます。ステップは PowerShell、pwsh、cmd.exe のいずれかでコマンドを実行し、ワークフロー単位でもステップ単位でも選べます。シェルを指定しない場合は PowerShell、pwsh、cmd.exe の順で選ばれます。呼び出し方はタスクスケジューラと同じです。
1 つの Dagu で複数の Windows サーバーのジョブを管理できますか?
2 つの方法でできます。別マシンでワーカーを動かしてコーディネーターから仕事を受け取る方法と、リモートノードで 1 つの Web UI から別々の Dagu を切り替える方法です。どちらでも操作画面はリモートデスクトップではなくブラウザになります。
対応している Windows のバージョンは?
Windows Server 2019 以降が安全な対象です。AF_UNIX に対応していない古いビルドでもワークフローの実行自体は行われますが、ライブ状態表示と停止制御用のソケットが使えないため、Dagu は警告を出してその機能なしで継続します。
次の一歩
まず 1 つのワークフローから。
Dagu をインストールし、不安定なスクリプトやエージェントタスクを 1 つ YAML に移して、実際の実行履歴を見て判断できます。