Windowsタスクスケジューラで自動化を回すときの実務メモ

この記事で分かること

Windowsタスクスケジューラで定期実行を回していて、私が実際につまずいた点をまとめます。戻り値267009・267014の意味、PowerShellのSet-ScheduledTaskでハマったTaskPathの指定、そして「戻り値0なのに何も処理されていなかった」件の話です。カタログ的な説明ではなく、運用して初めて分かったことだけを書きます。

267009 はエラーではありません

タスクの「前回の実行結果」に見慣れない数値が出ると、まずエラーコードだと思ってしまいます。私も最初はそう思いました。しかし 267009 は SCHED_S_TASK_RUNNING で、「まだ実行中」という状態を表しています。エラーではありません。

267009 = SCHED_S_TASK_RUNNING(まだ実行中)

つまり、この値を「失敗」として扱う監視を組んでしまうと、正常に走っている最中のタスクを毎回アラートに上げることになります。私はここで一度、無駄な通知を自分で作ってしまいました。実行中を意味する値なので、確認したいのは「なぜ止まらないのか」であって「なぜ失敗したのか」ではありません。

267014 は「時間切れで殺された」状態

もう一つよく出るのが 267014 で、これは SCHED_S_TASK_TERMINATED です。実行時間の上限に達して強制終了された状態を指します。

267014 = SCHED_S_TASK_TERMINATED(実行時間の上限に達して強制終了)

ここで重要なのは、これが「スクリプトが失敗した」ことを意味していない点です。スクリプト側は普通に処理を続けていたのに、外側から打ち切られただけ、というケースがあり得ます。そのため、267014 を見たときに調べるべきはスクリプトのエラーログではなく、そもそもなぜ上限時間内に終わらなかったのかという方向になります。処理量が増えたのか、途中で待ちが発生しているのか、原因の切り分けはタスクスケジューラ側の情報だけでは分かりません。ここは実行するスクリプト自身にログを吐かせて追うしかありませんでした。

Set-ScheduledTask は TaskPath を指定しないと見つからない

PowerShell からタスクの設定を変更しようとして、素直に名前だけ指定しても対象が見つからない、ということがあります。原因は単純で、Set-ScheduledTask はタスクの置き場所(TaskPath)を指定しないと見つけられないためです。

GUI 上ではフォルダ構造が目に見えているので忘れがちですが、コマンドから触るときは「どのフォルダに置いたタスクなのか」を明示する必要があります。自動化の設定変更をスクリプト化するときは、ここを最初に確認しておくと余計な時間を使わずに済みます。

一番怖いのは「戻り値0」です

267009 や 267014 は、少なくとも目に見える異常です。運用していて本当に危なかったのは、戻り値が 0 のケースでした。

実行結果が 0 でも、処理件数が 0 件ということがあります。スクリプトは正常終了しているので、タスクスケジューラの画面上は何の問題もなく見えます。しかし実際には何も処理していません。戻り値だけを見て「動いている」と判断すると、この失敗に気づけません。

私は実際に、戻り値0のまま3日連続で処理件数が0だったことがありました。しかも気づいたのは3日経ってからです。理由ははっきりしていて、ログに件数を数字で書いていなかったからです。「処理を開始しました」「完了しました」とは書いていても、「何件処理したか」を数字で残していませんでした。ログを見ても正常に見えるので、疑うきっかけがなかったのです。

結局どこを見るべきか

  • タスクスケジューラの戻り値は「タスクが動いたか」しか教えてくれません。「仕事をしたか」は教えてくれません
  • だから、処理件数は必ず数字でログに書きます。0 件なら 0 件と書き残します
  • 数字が残っていれば、「3日連続で0件」のような異常はログを並べた瞬間に見えます

なお、0件が続いていた根本原因の一般的なパターンについては、私が確認できた範囲を超えるので断定的なことは書きません。分かっているのは、ログに件数を数字で残していなかったせいで発見が3日遅れた、という事実だけです。

まとめ

  • 267009 は SCHED_S_TASK_RUNNING で「まだ実行中」。エラーではないので、失敗として扱わないこと
  • 267014 は SCHED_S_TASK_TERMINATED で、実行時間の上限に達して強制終了された状態。スクリプトの失敗とは限らない
  • PowerShell の Set-ScheduledTask は TaskPath(タスクの置き場所)を指定しないと対象を見つけられない
  • 実行結果0でも処理件数0のことがある。戻り値だけで「動いている」と判断すると失敗に気づけない
  • 実際に戻り値0のまま3日連続で処理件数0だった。ログに件数を数字で書いていなかったのが気づけなかった原因
  • 対策はシンプルで、処理件数を数字でログに残すこと