サーバーが自動的にDSTを使用する場合、cronを使用してDSTに対応していないアプリケーションで夏時間を実装するスクリプトをスケジュールするにはどうすればよいですか?

ニール・トロッデン

私のサーバー(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

crond1分間スリープしてから、ウェイクアップしてシステム時刻を照会し、それを独自の時刻の考え方(つまり、何も時計を変更しなかった場合の時刻)と比較します。実際の時間と予想される時間の差に基づいて、さまざまcrondなアクションを実行します。それらのうちの2つはあなたの場合に関連しています:

  1. 時間は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;
    
  2. 時間は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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ