私のサーバー(ubuntu 8.04LTSサーバーを実行している)は現在、時刻を午後9時38分BSTとして報告しています。BST(英国夏時間)はUTC(または、本当に混乱させたい場合はグリニッジ標準時)より1時間進んでいます。
議会の行為は、英国の私たちがBSTを使用することを定義しています
3月の最終日曜日の朝のグリニッジ標準時の1時に始まり、10月の最終日曜日の朝のグリニッジ標準時の1時に終わる期間。
cronでこれをスケジュールするのに問題はありませんが、使用する日付形式/タイムゾーンがわかりません。午前1時に前進し、終了時に午前2時に後退するように設定しますか?マシンがBSTを使用している場合は理にかなっていますが、システムクロックがトリガーされる前に午前1時にリセットされる可能性があるため、cronが午前2時にトリガーされないのではないかと心配しています。つまり、スクリプトの実行が1時間遅れます。
それともUTCだけを使用していますか?
答えは、cronソース(で取得できますapt-get source cron
)、特にファイルの159〜272行目のメインループにありますcron.c
。
crond
1分間スリープしてから、ウェイクアップしてシステム時刻を照会し、それを独自の時刻の考え方(つまり、何も時計を変更しなかった場合の時刻)と比較します。実際の時間と予想される時間の差に基づいて、さまざまcrond
なアクションを実行します。それらのうちの2つはあなたの場合に関連しています:
時間は5分以上3時間未満(DST開始)に跳ね上がりました。cronは、実際の時間にスケジュールされたワイルドカードジョブと、計算された時間と実際の時間の間の固定時間にスケジュールされたジョブを実行します。関連するソースは221〜247行目にあります。
/*
* case 2: timeDiff is a medium-sized positive number,
* for example because we went to DST run wildcard
* jobs once, then run any fixed-time jobs that would
* otherwise be skipped if we use up our minute
* (possible, if there are a lot of jobs to run) go
* around the loop again so that wildcard jobs have
* a chance to run, and we do our housekeeping
*/
Debug(DSCH, ("[%d], DST begins %d minutes to go\n",
getpid(), timeRunning - virtualTime))
/* run wildcard jobs for current minute */
find_jobs(timeRunning, &database, TRUE, FALSE);
/* run fixed-time jobs for each minute missed */
do {
if (job_runqueue())
sleep(10);
virtualTime++;
find_jobs(virtualTime, &database, FALSE, TRUE);
set_time();
} while (virtualTime< timeRunning &&
clockTime == timeRunning);
break;
時間は3時間未満遡ります(DSTは終了します):ワイルドカードジョブを実行するだけで、固定スケジュールジョブはすでに実行されているのでスキップします。関連するソースは247〜258行目です。
/*
* case 3: timeDiff is a small or medium-sized
* negative num, eg. because of DST ending just run
* the wildcard jobs. The fixed-time jobs probably
* have already run, and should not be repeated
* virtual time does not change until we are caught up
*/
Debug(DSCH, ("[%d], DST ends %d minutes to go\n",
getpid(), virtualTime - timeRunning))
find_jobs(timeRunning, &database, TRUE, FALSE);
break;
したがって、DSTに入るときは、問題はありません。スクリプトが実行されます(タイムリープの直前または直後)。
DSTを終了するときに、正確に1時にスケジュールすると、(固定時間の)ジョブがスキップされるリスクがあります。私の提案は、1時の1分前、または2時(またはそれ以降)に実行をスケジュールすることです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加