検索
連載

誤解しているのは中の人? Windowsの「曜日」の話 〜その2〜その知識、ホントに正しい? Windowsにまつわる都市伝説(144)

Windowsの「タスクスケジューラ」における曜日指定のスケジュールされたタスクは、利用者側の誤解やソフトウェアのバグが原因で、意図しないタイミングで実行される場合があります。また1つ、謎のバグが存在する可能性が明らかになりました。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「Windowsにまつわる都市伝説」のインデックス

Windowsにまつわる都市伝説

「曜日」の誤解と「タスクスケジューラ」の信じ難いバグ

 本連載第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)。

画面1
画面1 毎月第2火曜日に翌日の定例のWindows Updateをお知らせするタスク。Windows 10 バージョン1809だった当時は問題なく機能した

 その後、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}"


画面2
画面2 Windows 10 バージョン1903のPCに、毎週金曜日と月曜日のAM9:00(JST)に開始し、ログファイルに日時を書き込むタスクを別々に作成
画面3
画面3 Windows 8.1のPCに、毎週金曜日と月曜日のAM9:00(JST)に開始し、ログファイルに日時を書き込むタスクを別々に作成

 この例では「曜日」を含めるため、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

 ...


前日に実行されるではなく、前日と当日の2回だった

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る