Scientific Linux 6で自宅サーバー構築 番外編その1 Scientific Linux 6のcronについて

この記事は2022年10月以前に公開し、一度消失してしまったものですが、Wayback Machineのキャッシュデータから復元しました。当時の備忘録として再掲載します。

今回はちょっと本題から外れてScientific Linux 6のcronについて。

cron(正確にはcrondか)っていうのは分時日月曜日を指定して自動でジョブを実行できるプロセスです。
当然の事ながらcronのサービスが動いていないと自動実行されません。
またanacronという(RHEL5系だとanacronプロセス、RHEL6系だとcronプロセスで制御されるもの)プロセスが動くと本来のジョブ起動時間でなくても逆算してジョブを遅延実行してくれます。
※anacronの事はyasuも今回調べて始めて知りました。
詳しくはこちら。
 ITmedia エンタープライズ : Linux Tips「anacronデーモンって何?」
 anacron – Wikipedia

このcronとanacronの初期設定がCentOS5(RHEL5系)とScientific Linux 6(RHEL6系)では異なるというものです。
明限突破: RHEL6 (7)cronとanacronで詳しい説明やフローが掲載されていて非常によくわかりました。

ジョブって今まで全然気にせず/rootディレクトリに置いてcronの設定をしてきましたが、/etcディレクトリにcron用のディレクトリもあるので、今後cron用ディレクトリにシェルスクリプトを配置したいと思います。

そもそもcronの設定ファイルは
/etc/cron.d
/etc/crontab
/var/spool/cron/ユーザ名 (←crontab -e)
の、3ヶ所あってyasuがよくやっているcrontab -eは/var/spool/cron/ユーザ名の設定ファイルを修正していたことになります。

目次(クリックで開閉)

CentOS5 /etc/crontab の内容

毎時1分に/etc/cron.hourly直下にあるシェルを自動実行する
毎日4時2分に/etc/cron.daily直下にあるシェルを自動実行する
毎週日曜日の4時22分に/etc/cron.weekly直下にあるシェルを自動実行する
毎月1日の4時42分に/etc/cron.monthly直下にあるシェルを自動実行する
という設定になっています。

CentOS5 /etc/anacrontab の内容

/var/spool/anacron/cron.dailyファイルに記載された日付が現在時刻より1日以上前の場合、65分置きに/etc/cron.daily直下にあるシェルを再実行する
/var/spool/anacron/cron.weeklyファイルに記載された日付が現在時刻より7日以上前の場合、70分置きに/etc/cron.weekly直下にあるシェルを再実行する
/var/spool/anacron/cron.monthlyファイルに記載された日付が現在時刻より30日以上前の場合、75分置きに/etc/cron.monthly直下にあるシェルを再実行する
という設定になっています。

Scientific Linux 6 /etc/crontabの内容

自動実行の記載が一切ありません。

Scientific Linux 6 /etc/anacrontabの内容

/var/spool/anacron/cron.dailyファイルに記載された日付が現在時刻より1日以上前の場合
現在時刻が3時から22時の場合に5分+ランダム時間(0分から45分)置きに/etc/cron.daily直下にあるシェルを再実行する
/var/spool/anacron/cron.weeklyファイルに記載された日付が現在時刻より7日以上前の場合
現在時刻が3時から22時の場合に25分+ランダム時間(0分から45分)置きに/etc/cron.weekly直下にあるシェルを再実行する
/var/spool/anacron/cron.monthlyファイルに記載された日付が現在時刻より30日以上前の場合
現在時刻が3時から22時の場合に45分+ランダム時間(0分から45分)置きに/etc/cron.monthly直下にあるシェルを再実行する
という設定になっています。

明限突破ブログの管理人さんの見解ではRHEL6系は

1. cron.{daily|weekly|monthly} 以下に置いたファイルは、
実行時間が指定されていないため、いつ実行されるかわからない。

2. 明示的に実行タイミングを指定したい場合は、
/etc/cron.d
/etc/crontab
/var/spool/cron (crontab -e)

にて指定すること。

3. デフォルト登録されているログローテーション等の処理時間を固定化したい場合、crontabに実行時間を書くと、今までどおりの動作になる。

ということでした。

あとServer Worldさんのサイトでは

RHEL6 (互換である Scientific Linux 6 や CentOS 6 も同様) から、 デフォルトでは「cronie-anacron」というパッケージがインストールされ、 ジョブの定期実行は anacron で制御されるようになっています。 このため、cron のように決まりきった時間にジョブが実行されるわけではなく、 設定された時間内(3時-22時)に、ランダムに設定された時間分(0分-45分)待って実行されます。
これを従来通りの cron の設定に戻したければ、以下のように従来通りの cron 設定になっている「cronie-noanacron」をインストールしてください。 ただし、仮想環境においては、1台のマシン上で複数の仮想マシンが一斉に同じ時間に定期ジョブを実行する負荷も考える必要があるので、 仮想環境にしている場合は、各仮想マシンの cron 設定を手動で変更して時間をずらすか、 または、台数が多ければ一つ一つ設定を変えるのも大変なので anacron 制御のままにしておいた方がよいです。

とのことですので、cronie-noanacronのインストールとcronie-anacronのアンインストールをします。

cronie-noanacronのインストール

cronie-anacronのアンインストール

cronie-noanacronをインストールしcronie-anacronをアンインストールすると/etc/anacrontabファイルがなくなり、cron.daily、cron.weekly、cron.monthlyディレクトリ以下のシェルをランダムな時間で実行されなくなります。
/etc/cron.hourly/0anacronファイルもなくなります。
代わりに/etc/cron.d/dailyjobsというファイルができあがり、その中でrun-partsオプションでcron.{daily|weekly|monthly}ディレクトリ以下のシェルを実行するようになっているのでCentOSのように/etc/crontabに設定をする必要もありません。

cronie-anacronをアンインストール&cronie-noanacronをインストール後

/etc/cron.d/dailyjobs の内容

余談ですが1時間置きに実行するシェルは元々/etc/cron.d/0hourlyに設定されています。

/etc/cron.d/0hourly の内容

ronie-noanacronのインストールとcronie-anacronのアンインストールの影響か断言はできませんが、この作業をした次の日仕込んでいたcronが動いていませんでした。
調べてみるとcrondサービスが止まっていたのでサービスを再起動しました。

crondが起動しているか確認

crond起動

コメントする