レック・テクノロジー・コンサルティング株式会社TECH BLOG

RHEL 6のジョブスケジューラ「anacron」とは Part1

◆ご紹介する内容

こんにちは、Re:Qの中川(晴)と申します。

今回「RHEL6におけるジョブスケジューラ "anacron"」についてご紹介致します。

RHEL5まではcronでの実行がメインだったOS デフォルトジョブも、
RHEL6からほとんどが anacron に切り替わっております。

ただ、従来のシステムで多用されてきたcronと比べ、
anacron はまだ馴染み深くない方もいらっしゃるかもしれません。

そこで、今一度、anacronとcronで混在してしまう点を整理し、2回に分けてご紹介致します。

今回のパート1では、

・cronとanacronの違い
・cronとanacronをどのように使い分けるべきか
・cronとanacronの関係性
・anacronのスケジュール実行フロー

について、なるべくわかり易くイメージ図も交えご紹介致します。
※なお、RHEL6のデフォルト設定をベースにご説明させて頂きます。
※anacronはRHEL7でも実装予定ですが仕様未確認のため本記事の対象外となります。

 

◆anacronとは

anacronとは、
 cronとともにRHELで標準実装されている、ジョブ(コマンドやプログラム等)を
 スケジュール実行する仕組み
です。
 (Windowsでいうタスクスケジューラのようなものです)

RHELではcron、anacronともに利用可能なわけですが、
従来利用されているcronと、今回ご紹介するanacronの大きな違いの1つは
「ジョブ実行時刻の指定」にあります。

●cronは、「ジョブ実行時刻を指定可能です。」
 逆に言うと、指定した時刻以外には絶対に起動しません。

一方

●anacronは、「正確なジョブ実行時刻を指定できません。」
 実行時間帯(例:3時~22時)は指定できますが、
 実行時刻はその時間帯の中でOS側でスケジューリングします。

 

◆cronとanacronの違いまとめ

cronとanacronの違いをもう少し詳細にまとめてみます。

[table id=27 /]

anacron-pika3

[脱線] なぜanacronのような曖昧なスケジューリングの仕組みが必要なのでしょうか。

共有ハードウェア上に、複数仮想OSを動かすのがスタンダードな今、
各OSが一斉にジョブ動作すると、その時刻にリソース負荷が集中してしまいます。

だからといって、OS毎にジョブ時刻を変える設計もサーバ数増加時は管理が大変です。
ランダムにはなりますが、各OSが「今日中のどこかでジョブをやっておくね!」というのも、
ジョブ種別によっては役に立ちます。

 

◆どのように使い分けるべきか

ジョブ実行タイミングの自動分散を必要としない場合、
 従来どおり cron を使って問題ないと考えます。

ジョブ実行タイミングの自動分散を必要とする場合についても、
 柔軟に細かいスケジュール条件が指定可能な cron に対し、
 anacron は不向きとなる条件は数多くありますのでご注意ください。
 

anacronに不向きなジョブ

●1日に複数回起動が必要

●正確な時刻指定が必要

●ジョブ間で実行順序に前後関係がある

●システム管理ユーザ以外がスケジュール登録利用する

 

◆anacronスケジュール実行フロー

anacronは常駐プロセスではありません。
ではanacronはどのようにプロセス起動しスケジュール実行しているのでしょうか。

実はanacronは、cronから1時間に1回プロセス起動されています。
 

▼スケジュール実行フローをイメージ図にしてみます。

anacron-01

 

▼イメージ図を、フローで簡単にご説明します。

①[cron]:hourlyスケジュール実行

 cronが、hourlyスケジュールジョブ(1時間に1回、毎時1分起動)として、
 /etc/cron.hourlyディレクトリ配下のスクリプトを実行します。
 

●関係するのはこの設定ファイル
 /etc/cron.d/0hourly
[table id=30 /]

  ↓
②[script]:anacron起動スクリプト実行

 ①により、cronが/etc/cron.hourly/0anacron スクリプトを実行したことで
 anacronが起動します。
 (=hourlyスケジュールのため1時間に1回起動ということになります)
 

●関係するのはこのスクリプト
 /etc/cron.hourly/0anacron

[table id=31 /]

  ↓
③[anacron]:anacronジョブスケジュール設定を読み込み

 起動したanacronプロセスは、anacron設定ファイル(/etc/anacrontab)より、
 ジョブのスケジュール設定を読み込みます。

 「ジョブスケジュール設定(何日おきに実行するかで指定)」と、
 「④で実施する"ジョブの前回実行履歴"」をふまえ
 
 [本日スケジューリングされている] かつ [本日未実施] のジョブを抽出します。
 

●関係するのはこの設定ファイル
 /etc/anacrontab

 ※設定方法などは、次回のパート2の記事でご紹介する予定です。
[table id=29 /]

  ↓
④[anacron]:各ジョブの前回実行履歴を読み込み

 当日既に実施済みのジョブか否かを、前回ジョブ実施日が記録された
 /var/spool/anacron/[ジョブ名] ファイルより確認します。

 ※本ファイルは、anacronに登録したジョブ別にファイル生成されています。
  例:cron.dailyジョブ → /var/spool/anacron/cron.dailyファイル

 ※本ファイルに記録されたジョブ履歴は、1世代(前回実行日のみ)で、
  YYYYMMDD形式(例:20140421)で記録されております。
  時間までは記録はされておりません
 

●関係するのはこの設定ファイル
 /var/spool/anacron/[ジョブ名]

[table id=32 /]

  ↓
⑤[anacron]:ジョブスケジューリング

④、⑤により抽出された本日実施が必要なジョブは、
前述のとおりOS依存でランダムにてジョブ実行時刻が決定されます。
仕組みの概略は以下になります。

● ジョブ実行時刻はどう決まるか

 anacron起動後、ランダムで決定した「遅延時間」を待機後にジョブ実行します。

 例として、3時にanacronが起動し、ランダム決定した遅延時間が計30分であれば、
 3時30分がジョブ実行スケジュールとなります。

 

● 「遅延時間」とは何か

 /etc/anacrontab内の設定値に基づき以下のように決定します。

 「遅延時間」=共通設定にてランダム決定した遅延時間+
         ジョブ個別設定にてランダム決定した遅延時間

 ※"ランダム決定"の意味
  設定で最大値のみを指定し、最大値以内にてOS側が乱数決定する仕組みを指します。
  (よって遅延時間の範囲自体は制御可能です)

 ※"共通設定"のイメージ
  ジョブAの遅延設定=共通設定+ジョブA個別の設定
  ジョブBの遅延設定=共通設定+ジョブB個別の設定

 ※/etc/anacrontab内の設定項目
  ・共通設定: RANDOM_DELAY(設定ファイルに1つ定義)
  ・ジョブ個別の遅延時間: delay in minutes(ジョブ別に定義)


 例:
  ジョブ共通のRANDOM_DELAY値を45(分)、
  ジョブAのdelay in minutes値を20(分)と設定した結果、
  ある日のジョブAの遅延時間は、ランダムで40分+13分=53分となった。
  次の日は10分+19分=29分となった。

 

● その他条件

 /etc/anacrontab内の設定にて「ジョブ実行可能な時間帯」を定義しています
 (START_HOURS_RANGE設定値)

 そのため、ランダム決定で算出した時刻が、設定時間帯内に納まっていない場合は
 今回のanacron起動では実行されません。

 終日実行されないというわけではなく、anacronは1時間に1回起動されますので、
 1時間後の次回anacron起動時以降に後ろ倒しするという流れです。

 また、anacronはジョブの輻輳を嫌うため、
 登録しておいたジョブの時間帯が重ならないように自動制御も行われます。
 

Part1は以上です。
次回のPart2では、anacronの具体的な設定方法、設定上の注意点等をご紹介する予定です。

ご参考頂けたら幸いです。ありがとうございました。

この記事をシェアする

  • Facebook
  • X
  • Pocket
  • Line
  • Hatena
  • Linkedin

資料請求・お問い合わせはこちら

ページトップへ戻る