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

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

Windowsタスクスケジューラで自動化を回していて、実際につまずいた点をまとめます。戻り値267009・267014の意味、PowerShellでタスクを触るときのTaskPath指定、そして「戻り値0なのに何も処理していなかった」という失敗の話です。

戻り値をエラーコードだと思い込んで時間を無駄にした

タスクスケジューラの「前回の実行結果」に見慣れない数字が出ると、まずエラーコードを検索したくなります。ですが、そこに出る値はエラーとは限りません。

267009 は「まだ実行中」

戻り値 267009 は SCHED_S_TASK_RUNNING です。つまりタスクがまだ走っている最中という状態表示で、エラーではありません。実行結果の欄を見た瞬間の状態がそのまま表示されているだけなので、長めに動く処理では普通に見えます。

ここを異常だと判断して手動でタスクを止めたり、設定を変えたりすると、原因のない箇所をいじることになります。私はここで一度、無駄に設定を見直しました。

267014 は「上限に達して強制終了された」

一方、戻り値 267014 は SCHED_S_TASK_TERMINATED です。これは実行時間の上限に達して、タスクが強制的に終了させられた状態を示します。

これは注意すべき値です。処理が途中で切られているので、やりたかった処理が完了していない可能性があります。267009と267014は数字が近く、どちらも「S_」で始まるので見分けがつきにくいのですが、意味はまったく違います。

ポイント

267009=まだ実行中(放っておいてよい)。267014=実行時間上限で強制終了(処理が途中で切れている疑いがある)。この2つを取り違えると、対応の方向が逆になります。

PowerShellでタスクを触るときはTaskPathが必要

GUIではなくPowerShellからタスクを変更しようとしたとき、Set-ScheduledTask でタスクが見つからないという状況になりました。原因はタスクの置き場所(TaskPath)を指定していなかったことです。

Set-ScheduledTask は TaskPath を指定しないとタスクを見つけられません。タスク名だけ合っていても、置き場所が違えば対象にたどり着けないということです。フォルダを分けてタスクを整理している場合は特に、名前だけで呼び出せると思い込まないほうがよいです。

注意

「タスク名は合っているのに見つからない」というときは、まずTaskPathを疑ってください。スクリプト側のミスではなく、指定が足りていないだけのことがあります。

いちばん危なかったのは「戻り値0」でした

ここが本題です。267014のような分かりやすい異常値よりも、戻り値0のほうが危険でした。

0は「異常なく終わった」でしかない

実行結果が0でも、処理件数が0件のことがあります。スクリプトがエラーを出さずに最後まで到達すれば0になるので、「何もしなかった」も「ちゃんと処理した」も同じ0として並んでしまいます。

私は実際にこれで失敗しました。戻り値0のまま、3日連続で処理件数が0件でした。スケジューラの画面上は毎回きれいに0が並んでいたので、動いていると思い込んでいました。

実測

3日連続 処理件数0件
戻り値はすべて0。スケジューラの表示だけでは異常に見えなかった

気づけなかった理由はログでした

気づけなかった直接の原因は、ログに処理件数を数字で書いていなかったことです。「開始しました」「終了しました」があっても、何件処理したのかが数字で残っていなければ、0件と正常稼働を区別できません。

戻り値0でも中身は同じではない
戻り値0でも中身は同じではない
失敗したこと

戻り値だけを監視対象にしていました。戻り値0を「動いている証拠」として扱っていたため、3日間気づけませんでした。スケジューラの実行結果は、処理が成功したかどうかの証明にはなりません。

この経験から変えたこと

  1. ログに処理件数を数字で出すようにしました。0件なら0とログに残るようにします。
  2. 戻り値の確認だけで判断せず、件数の数字を見るようにしました。
  3. 267009と267014を区別して見るようにしました。267014が出たら、処理が途中で切れた前提で中身を確認します。
うまくいったこと

件数を数字でログに残すようにしてから、「0件が続いている」という状態そのものが目に見えるようになりました。戻り値の表示は変わらなくても、ログを見れば異常だと分かります。

まだ分かっていないこと

正直に書いておくと、3日連続で0件になった根本原因までは、この時点では特定できていません。分かったのは「戻り値0では0件に気づけない」という監視側の欠陥のほうです。

また、267014が出る条件について、私が確認できているのは「実行時間の上限に達して強制終了された状態を示す」という意味だけです。どういう処理でどのくらい時間がかかると上限に当たるのかは、環境ごとに実測しないと言えません。ここを一般論で埋めても役に立たないので、書きません。

戻り値の読み方の整理

戻り値 名前 意味
267009 SCHED_S_TASK_RUNNING まだ実行中。エラーではない
267014 SCHED_S_TASK_TERMINATED 実行時間の上限に達して強制終了された
0 — 異常終了はしていない。ただし処理0件でも0になる
  • 267009を異常と誤解しなくなった
  • 267014を「途中で切れた」として扱えるようになった
  • 処理件数を数字でログに残すようにした
  • 3日連続0件になった根本原因の特定
  • 267014が出るまでの具体的な時間の見積もり
まとめ

  • 267009(SCHED_S_TASK_RUNNING)はまだ実行中という表示で、エラーではありません。
  • 267014(SCHED_S_TASK_TERMINATED)は実行時間の上限に達して強制終了された状態で、処理が途中で切れている疑いがあります。
  • Set-ScheduledTask はTaskPath(タスクの置き場所)を指定しないとタスクを見つけられません。
  • 実行結果が0でも処理が0件のことがあります。戻り値だけで「動いている」と判断すると失敗に気づけません。
  • 実際に戻り値0のまま3日連続で処理件数0件でした。ログに件数を数字で書いていなかったため気づけませんでした。件数は必ず数字で残してください。
広告