この記事は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 の内容
[root@centos ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
毎時1分に/etc/cron.hourly直下にあるシェルを自動実行する
毎日4時2分に/etc/cron.daily直下にあるシェルを自動実行する
毎週日曜日の4時22分に/etc/cron.weekly直下にあるシェルを自動実行する
毎月1日の4時42分に/etc/cron.monthly直下にあるシェルを自動実行する
という設定になっています。
CentOS5 /etc/anacrontab の内容
[root@centos ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
/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の内容
[root@sl6 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
自動実行の記載が一切ありません。
Scientific Linux 6 /etc/anacrontabの内容
[root@sl6 ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
/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のインストール
[root@sl6 ~]# yum -y install cronie-noanacron
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package cronie-noanacron.x86_64 0:1.4.4-2.el6 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
=================================================
Package Arch Version Repository Size
=================================================
Installing:
cronie-noanacron x86_64 1.4.4-2.el6 sl 6.5 k
Transaction Summary
=================================================
Install 1 Package(s)
Upgrade 0 Package(s)
Total download size: 6.5 k
Installed size: 326
Downloading Packages:
cronie-noanacron-1.4.4-2.el6.x86_64.rpm | 6.5 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : cronie-noanacron-1.4.4-2.el6.x86_64 1/1
Installed:
cronie-noanacron.x86_64 0:1.4.4-2.el6
Complete!
cronie-anacronのアンインストール
[root@sl6 ~]# yum -y remove cronie-anacron
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package cronie-anacron.x86_64 0:1.4.4-2.el6 set to be erased
--> Finished Dependency Resolution
Dependencies Resolved
=================================================
Package
Arch Version Repository Size
=================================================
Removing:
cronie-anacron
x86_64 1.4.4-2.el6 @anaconda-ScientificLinux-201103021619.x86_64/6 41 k
Transaction Summary
=================================================
Remove 1 Package(s)
Reinstall 0 Package(s)
Downgrade 0 Package(s)
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Erasing : cronie-anacron-1.4.4-2.el6.x86_64 1/1
Removed:
cronie-anacron.x86_64 0:1.4.4-2.el6
Complete!
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 の内容
[root@sl6 ~]# cat /etc/cron.d/dailyjobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
余談ですが1時間置きに実行するシェルは元々/etc/cron.d/0hourlyに設定されています。
/etc/cron.d/0hourly の内容
[root@sl6 ~]# cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
ronie-noanacronのインストールとcronie-anacronのアンインストールの影響か断言はできませんが、この作業をした次の日仕込んでいたcronが動いていませんでした。
調べてみるとcrondサービスが止まっていたのでサービスを再起動しました。
crondが起動しているか確認
[root@sl6 ~]# ps aux |grep crond
crond起動
[root@sl6 ~]# /etc/rc.d/init.d/crond start
crond を起動中: [ OK ]
