タイムゾーンがAEST(オーストラリア東部標準時)であると仮定すると、時間は最初は午前2時から午前3時にジャンプし、最後は午前3時から午前2時に反転します。
夏時間は10月の最初の日曜日の午前2時に始まり、時計を1時間前に移動します。 4月の最初の日曜日は午前2時(午前3時夏時間)に終わり、時計は1時間前に移動します。
DST(冬から夏)時間が変更されると、時間は午前2時から午前3時に移動します。ジョブの実行がこの時間範囲内にあるようにスケジュールされている場合、ジョブは実行されません。
01:57:00
01:58:00
01:59:00
03:00:00 <--- job will not run as between 02:00 and 03:00 will disappear
03:01:00
03:02:00
時間がDST(夏から冬)に変わると、午前3時から午前2時に時間が反転します。この時間範囲内に実行がスケジュールされると、実行は2回実行される。
01:59:00
02:00:00
...
02:57:00
02:58:00
02:59:00
02:00:00 <--- job will be run twice as between 02:00 and 03:00 will repeat
02:01:00
02:02:00
のように夏時間、これが予想されるようです。それでは、まだDSTベースの時間を使用する必要がありますが、ジョブが実行されない、または2回実行されるのを防ぐための可能な解決策は何ですか?夏時間の無効化固定GMT + NまたはGMT - Nを使用することをお勧めしますが、DSTベースの時間を使用する必要があるため使用できません。
Cronまたはタイムスタンプベースのプログラミングを使用せずにEpochまたはUTCを使用するスケジューラが必要ですか?
答え1
1つのオプションは、DST調整が行われないようにUTC + 10オフセットタイムゾーンでcronを実行することです。 この質問を見ました。これを行う方法の例です。
もう1つのオプションは、DSTの開始日にジョブを2回実行するように構成することです。
0 2 * * * /path/to/job
0 3 1-7 oct sun /path/to/job
したがって、夏時間が始まると、見逃すことはありません。
その後、スクリプトで今日のジョブがまだ実行されていないことを確認する必要があります。 1つの方法は、日付の時間とタイムゾーンを確認することです。 DSTが終了すると、「date +」%a%m%H%Z」が次のように報告されるとします。
02:59:00: Sun 10 02 ACDT
02:00:00: Sun 10 02 ACT
したがって、スクリプトは次のことを確認できます。
now=`date +"%a %m %H %Z"`
if [ "$now" -eq "Sun 10 02 ACT" ]; then
echo "DST ended - not running"
exit 0;
fi;