Windowsの「タスクスケジューラ」における曜日指定のスケジュールされたタスクは、利用者側の誤解やソフトウェアのバグが原因で、意図しないタイミングで実行される場合があります。また1つ、謎のバグが存在する可能性が明らかになりました。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載第136回では、Windows Updateの定例更新日の誤解、それに絡めてWindows 10 バージョン1803以前のWindows 10、および対応するバージョンのWindows Serverに存在した「タスクスケジューラ」の謎のバグについて紹介しました。
第136回では、Windows Updateの毎月定例の更新日は「第2火曜日固定」にもかかわらず(日本では時差の関係で翌水曜日)、「第2水曜日」と勘違いしている人がいることを指摘しました。また、それに絡めて毎月(または毎週)の曜日指定でスケジュールされたタスクにある、よくある誤解について指摘しました。その誤解とは、タスクスケジューラには「第N曜日」(Nは1〜4、または最終)という指定はあっても、「第N週」という指定はそもそも存在しないということです。
しかし、Windows 10 バージョン1803以前のWindows 10、および対応するバージョンのWindows Serverには、長い間、謎のバグが存在し、その誤解を助長させていたかもしれないことを指摘しました。“謎のバグ”とは、曜日指定でスケジュールされたタスクが、実行日が7の倍数のときにタスクが実行されなかったり、1週間前に実行されたりするという信じ難いバグです。このバグは、2018年9月の更新プログラムで修正済みです(Windows 10 バージョン1511および1703は修正の予定なし)。
2019年8月21日、Japan Windows Commercial Supportフォーラムが、Windowsの一部のバージョンに存在する、また別の謎のバグについて情報を公開しました。今度の謎のバグとは、曜日指定のタスクが、前の曜日(つまり前日)に実行される場合があるというものです。
このバグが影響するのは、以下の4つの条件を全て満たす場合だそうです。おそらく、Windows 10バージョン1607の全てのエディションに影響すると思いますが、LTSBではなく半期チャネル(SAC)バージョンは既にサポートが終了しているため、含まれないのでしょう。当面の回避策は、日本時間(JST)AM9:00以外に少しずらすこと(例えば、AM8:59)が案内されています。
(1)Windowsのバージョンが以下であること
Windows 8.1/Windows Server 2012 R2
Windows 10 Enterprise 2016 LTSB/Windows Server 2016
Windows 10 バージョン1903
(2)2019年3月第3週以降の更新プログラムが適用されていること(Windows 10 バージョン1903はリリース時から)
(3)毎週や毎月の指定された曜日に実行するタスクであること
(4)タスクの実行時間が日本時間(JST)AM9:00(UTC 0:00)であること
第136回では、Windows Updateの定例更新日を「第2火曜日」に(つまり日本では前日に)お知らせする方法として、「明日は毎月恒例のWindows Updateの日(第2火曜日の翌日)」というメッセージを表示させるタスクを紹介しました。このタスクは毎月第2火曜日の9:00に実行するようにスケジューリングしていたのですが、当時はWindows 10 バージョン1809だったので上記の要件は満たさず、問題なく機能しているようでした(画面1)。
その後、Windows 10 バージョン1903にアップグレードしましたが、その時点で上記の要件を満たしてしまうことになります。しかし、第2火曜日の9:00にちゃんとメッセージを表示していたように記憶しています。記憶は定かではありません。これは一体どういうことでしょうか。このバグの影響を受けるはずの「Windows 8.1」「Windows Server 2016」、Windows 10 バージョン1903の3台にダミーのタスクを作成して実験してみました。
Windows 10 バージョン1903(画面2)、Windows 8.1(画面3)、Windows Server 2016の3台に、次のような設定で、毎週の金曜日と月曜日に「プログラムの開始」操作でログファイルを出力するだけの簡単な2つのタスクを作成しました。「次回の実行時刻」を見る限り、それぞれ次の金曜日と月曜日のAM9:00(JST)に実行が予定されているのが分かります。
DemoFridayTask
トリガー:毎週金曜日、AM9:00に起動
操作:powershell.exe -Command "& {(Get-Date).ToString('yyyy/MM/dd dddd HH:mm') >> C:\work\logs\FridayTask.log}"
DemoMondayTask
トリガー:毎週月曜日、AM9:00に起動
操作:powershell.exe -Command "& {(Get-Date).ToString('yyyy/MM/dd dddd HH:mm') >> C:\work\logs\MondayTask.log}"
この例では「曜日」を含めるため、Windows PowerShellの「Get-Date」コマンドレットを利用していますが、日時だけを出力するなら「cmd.exe /c "echo %DATE%%TIME% >> C:\Work\logs\ファイル名.log"」のように簡単に記述できます。
タスクが正常に実行されれば、「C:\Work\Logs\FridaryTask.log」と「MondayTask.log」には次のように「年月日 金曜日 09:00」および「年月日 月曜日 09:00」のテキストが記録されるはずです。謎のバグが再現するなら、それぞれ「年月日 木曜日 09:00」および「年月日 日曜日 09:00」になるでしょう。
C:\Work\Logs\FridayTask.log
2019/08/23 金曜日 09:00
2019/08/30 金曜日 09:00
...
C:\Work\Logs\MondayTask.log
2019/08/26 月曜日 09:00
2019/09/02 月曜日 09:00
...
Copyright © ITmedia, Inc. All Rights Reserved.