こんにちは、Windowsインフラエンジニア ばにゃです。
タスクスケジューラにてタスクを定期実行(繰り返し実行)させる際、次回の実行時刻にタスクが実行されないという事象が発生することがあります。タスクがまったく実行されないわけではなく、たまに実行されないという事象です。
そこで本記事ではタスクスケジューラの定期実行(繰り返し)タスクが次回の実行時刻に実行されない場合の対処方法について解説します。
結論からいうと「タスクが既に実行中の場合に適用される規則」の設定により、タスクが想定通りに定期実行されていない可能性があります。
どういった動作を実現したいのかによりますが、基本的には上記設定を「新しいインスタンスを並列で実行」にすることで、問題なく定期実行されるはずです。
「タスクが既に実行中の場合に適用される規則」の設定方法や詳細動作について知りたい場合は、以降に記載する内容を確認してみてください。
前提となる環境
本記事では、以下のような環境を例として記載します。この環境で私自身が実機動作確認済みの手順となります。
- Windows Server 2019
- Windows Server 2016
- Windows 10
原因と対処方法
前回実行したタスクが終了していない
タスクスケジューラの「タスクが既に実行中の場合に適用される規則」が「新しいインスタンスを開始しない」というデフォルト設定になっている場合、前回実行されたタスクが終了していない状態で次回の定期実行時間をむかえると、次回の定期実行タスクが開始されません。
例えば以下のように、1時間に1回タスクが定期実行される設定でタスクの実行に1時間以上かかるとこのような状態になる可能性があります。
01:00の定期実行タスクが開始
01:00の定期実行タスクが終了していないため、02:00の定期実行タスクは開始されない
01:00の定期実行タスクが終了
03:00の定期実行タスクが開始
上記が理由でタスクが実行されなかった場合、タスクスケジューラの「前回の実行結果」には以下のメッセージが表示されます。
オペレーターまたは管理者が要求を拒否しました。(0x800710E0)
タスクが既に実行中の場合に適用される規則を変更する
前回実行したタスクが実行中であっても次回のタスクを並列で実行させたい場合「タスクが既に実行中の場合に適用される規則」の設定を「新しいインスタンスを並列で実行」へ変更します。
- Windows + Rキー より「ファイル名を指定して実行」を起動し、以下のように入力してタスクスケジューラを起動します。
taskschd.msc
- 設定を変更したいタスクを右クリックしてプロパティを開きます。
- 設定タブを選択し「タスクが既に実行中の場合に適用される規則」の設定を「新しいインスタンスを並列で実行」へ変更します。
以上で設定は完了です。
タスクが既に実行中の場合に適用される規則の動作
「タスクが既に実行中の場合に適用される規則」には以下4つの設定があります。それぞれを選択した際の動作について解説します。
新しいインスタンスを開始しない
「タスクが既に実行中の場合に適用される規則」を「新しいインスタンスを開始しない」としている場合、実行中のタスクがある場合は次の新しいタスクが開始されません。
タスクを並列で実行させたくない、タスク実行中は次のタスクがスキップされても問題ない、という場合には「新しいインスタンスを開始しない」を選択します。既定ではこの「新しいインスタンスを開始しない」が選択されています。
イベントログに以下のような記録がある場合、タスクが実行されずにスキップされていることが確認可能です。
ログの名前:Microsoft-Windows-TaskScheduler/Operational
レベル:警告
ID:322
ソース:TaskScheduler
タスクのカテゴリ:起動要求が無視されました。インスタンスは既に実行中です
メッセージ:タスク スケジューラは、タスク “\~” を起動しませんでした。同じタスクのインスタンス “{xxxx}” が既に実行されているためです。
新しいインスタンスを並列で実行
「タスクが既に実行中の場合に適用される規則」を「新しいインスタンスを並列で実行」としている場合、実行中のタスクがある場合でも新しいタスクは並列で実行されます。
タスクが並列で実行されても問題ない、指定した時間に必ず実行させたい、という場合には「新しいインスタンスを並列で実行」を選択します。
新しいインスタンスをキューに追加
「タスクが既に実行中の場合に適用される規則」を「新しいインスタンスをキューに追加」としている場合、実行中のタスクが終了するまでは次の新しいタスクは実行されずにキューに溜まります。実行中のタスクが終了した後にキューに溜まっていた次のタスクが実行される動作となります。
タスクを並列で実行させたくない、タスクはスキップされることなく順番に実行されるようにしたい、という場合には「新しいインスタンスをキューに追加」を選択します。
イベントログに以下のような記録がある場合、タスクがキューに追加されていることが確認可能です。
ログの名前:Microsoft-Windows-TaskScheduler/Operational
レベル:警告
ID:324
ソース:TaskScheduler
タスクのカテゴリ:起動要求がキューに入れられました。インスタンスは既に実行中です
メッセージ:タスク スケジューラは、タスク “\~” のインスタンス “{yyyy}” をキューに置き、インスタンス “{xxxx}” が完了すると直ちに起動します。
既存のインスタンスの停止
「タスクが既に実行中の場合に適用される規則」を「既存のインスタンスの停止」としている場合、タスク実行中に次のタスク実行時間がくると、実行中のタスクが強制終了されて次のタスクが実行される動作となります。
実行中のタスクを強制終了させてでもタスク開始時間には次のタスクを実行させたい場合には「既存のインスタンスの停止」を選択します。
イベントログに以下のような記録がある場合、タスクが強制終了されていることが確認可能です。
ログの名前:Microsoft-Windows-TaskScheduler/Operational
レベル:警告
ID:323
ソース:TaskScheduler
タスクのカテゴリ:起動要求が承認されました。現在のインスタンスが停止されました
メッセージ:タスク スケジューラは、新しいインスタンス “{yyyy}” を起動するために、タスク “\~” のインスタンス “{xxxx}” を停止しました。
参考情報
関連記事
Microsoft ドキュメント
TaskSettings.MultipleInstances プロパティ や Task Settings に関してはMicrosoft の以下サイトも参考にしてください。
コメント