~~NOCACHE~~
~~DISCUSSION~~
## 92.anacron動作仕様調査
anacronの理解を深めるため動作仕様を確認してみた。
### 図にして仕組みを理解しよう
まずは、anacronが実行されるまでの流れを図にしています。
ファイル/ディレクトリ構造はOS構築直後の初期状態としています。
{{:InfrastructureConstruction:RHEL8:pasted:20210126-234636.png?direct 800x0}}
最終的なフローは下記の通り、なぜこうなったか?の部分は[[InfrastructureConstruction:RHEL8:OperationSpecificationSurvey-anacron#/etc/anacrontabの動作仕様確認|/etc/anacrontabの動作仕様確認]]に書いてあります。
2021/01/27フローに誤りがあったので修正
{{:InfrastructureConstruction:RHEL8:pasted:20210127-220855.png?direct 600x0}}
#### ①毎時1分に[/etc/cron.hourly]配下のスクリプト[0anacron]を実行
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
#### ②実行タイミングの日付と[/var/spool/anacron/cron.daily]に記録された日付を比較して、一致したら終了、不一致なら[/usr/sbin/anacron -s]を実行
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0
fi
# Do not run jobs when on battery power
online=1
for psupply in AC ADP0 ; do
sysfile="/sys/class/power_supply/$psupply/online"
if [ -f $sysfile ] ; then
if [ `cat $sysfile 2>/dev/null`x = 1x ]; then
online=1
break
else
online=0
fi
fi
done
if [ $online = 0 ]; then
exit 0
fi
/usr/sbin/anacron -s
#### ③[anacrontab]の設定に基づき、下記のディレクトリ配下のスクリプトを実行
・/etc/cron.daily
・/etc/cron.weekly
・/etc/cron.monthly
# /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-24
#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
### /etc/anacrontabの動作仕様確認
[anacrontab]は、下記の状態で確認する。
RANDOM_DELAY=0
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
#### ケース1:START_HOURS_RANGE範囲外に実行する(weekly、monthlyは最終実行日が[anacron]の対象)
各cronの最終実行日は以下の通り、実施日は20210126の23時台
→[anacron]は実行されない。
%%・/var/spool/anacron/cron.daily:%%20210126
%%・/var/spool/anacron/cron.weekly:%%20201226
%%・/var/spool/anacron/cron.monthly:%%20201226
Jan 26 23:50:45 run-parts[1992]: (/etc/cron.hourly) starting 0anacron
Jan 26 23:50:45 run-parts[1992]: (/etc/cron.hourly) finished 0anacron
#### ケース2:START_HOURS_RANGE範囲外に実行する(daily、weekly、monthlyは最終実行日が[anacron]の対象)
各cronの最終実行日は以下の通り、実施日は20210126の23時台
→[anacron]は実行されるが、何もせず終了する。
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20201226
%%・/var/spool/anacron/cron.monthly:%%20201226
Jan 26 23:54:48 run-parts[2064]: (/etc/cron.hourly) starting 0anacron
Jan 26 23:54:48 run-parts[2064]: (/etc/cron.hourly) finished 0anacron
Jan 26 23:54:48 anacron[2073]: Anacron started on 2021-01-26
Jan 26 23:54:48 anacron[2073]: Normal exit (0 jobs run)
#### ケース3:START_HOURS_RANGE範囲内に実行する(weekly、monthlyは最終実行日が[anacron]の対象外)
各cronの最終実行日は以下の通り、実施日は20210126の21時台
→dailyのみ実行される。
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20210120
%%・/var/spool/anacron/cron.monthly:%%20210113
Jan 26 21:35:41 run-parts[1794]: (/etc/cron.hourly) starting 0anacron
Jan 26 21:35:41 run-parts[1794]: (/etc/cron.hourly) finished 0anacron
Jan 26 21:35:41 anacron[1803]: Anacron started on 2021-01-26
Jan 26 21:35:41 anacron[1803]: Will run job `cron.daily' in 5 min.
Jan 26 21:35:41 anacron[1803]: Jobs will be executed sequentially
#### ケース4:START_HOURS_RANGE範囲内に実行する(daily、weekly、monthlyは最終実行日が[anacron]の対象)
各cronの最終実行日は以下の通り、実施日は20210126の20時台
→daily、weekly、monthlyが実行される。
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20201226
%%・/var/spool/anacron/cron.monthly:%%20201226
Jan 26 20:59:25 run-parts[2132]: (/etc/cron.hourly) starting 0anacron
Jan 26 20:59:25 run-parts[2132]: (/etc/cron.hourly) finished 0anacron
Jan 26 20:59:25 anacron[2141]: Anacron started on 2021-01-26
Jan 26 20:59:25 anacron[2141]: Will run job `cron.daily' in 5 min.
Jan 26 20:59:25 anacron[2141]: Will run job `cron.weekly' in 25 min.
Jan 26 20:59:25 anacron[2141]: Will run job `cron.monthly' in 45 min.
Jan 26 20:59:25 anacron[2141]: Jobs will be executed sequentially
#### ケース5:START_HOURS_RANGE範囲内に実行する([RANDOM_DELAY]+[delay in minutes]で[START_HOURS_RANGE]の範囲に入れた①)
RANDOM_DELAY=0
START_HOURS_RANGE=2-22
#period in days delay in minutes job-identifier command
1 180 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 60 cron.monthly nice run-parts /etc/cron.monthly
各cronの最終実行日は以下の通り、実施日は20210126の0時30分に実施
→dailyが実行される。(dailyは[START_HOURS_RANGE]の範囲に入るが、monthlyは入らない)
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20210126
%%・/var/spool/anacron/cron.monthly:%%20201226
Jan 26 00:30:40 run-parts[2124]: (/etc/cron.hourly) starting 0anacron
Jan 26 00:30:40 run-parts[2124]: (/etc/cron.hourly) finished 0anacron
Jan 26 00:30:40 anacron[2133]: Anacron started on 2021-01-26
Jan 26 00:30:40 anacron[2133]: Will run job `cron.daily' in 180 min.
Jan 26 00:30:40 anacron[2133]: Jobs will be executed sequentially
#### ケース6:START_HOURS_RANGE範囲内に実行する([RANDOM_DELAY]+[delay in minutes]で[START_HOURS_RANGE]の範囲に入れた②)
RANDOM_DELAY=180
START_HOURS_RANGE=2-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
各cronの最終実行日は以下の通り、実施日は20210126の0時47分に実施
→[RANDOM_DELAY]+[delay in minutes]で、[START_HOURS_RANGE]の範囲に入った項目が実行される。
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20210119
%%・/var/spool/anacron/cron.monthly:%%20201226
#1回目 RANDOM_DELAYは79分
Jan 26 00:47:27 run-parts[2366]: (/etc/cron.hourly) starting 0anacron
Jan 26 00:47:27 run-parts[2366]: (/etc/cron.hourly) finished 0anacron
Jan 26 00:47:27 anacron[2375]: Anacron started on 2021-01-27
Jan 26 00:47:27 anacron[2375]: Will run job `cron.daily' in 84 min.
Jan 26 00:47:27 anacron[2375]: Will run job `cron.weekly' in 104 min.
Jan 26 00:47:27 anacron[2375]: Will run job `cron.monthly' in 124 min.
Jan 26 00:47:27 anacron[2375]: Jobs will be executed sequentially
#2回目 RANDOM_DELAYは36分
Jan 26 00:47:54 run-parts[2385]: (/etc/cron.hourly) starting 0anacron
Jan 26 00:47:54 run-parts[2385]: (/etc/cron.hourly) finished 0anacron
Jan 26 00:47:54 anacron[2394]: Anacron started on 2021-01-27
Jan 26 00:47:54 anacron[2394]: Will run job `cron.monthly' in 81 min.
Jan 26 00:47:54 anacron[2394]: Jobs will be executed sequentially
#### ケース7:START_HOURS_RANGE範囲内に実行する([RANDOM_DELAY]+[delay in minutes]で[START_HOURS_RANGE]の範囲を超えさせた)
[cron.daily]の[delay in minutes]を「180」にして[START_HOURS_RANGE]の範囲を超えさせた。
RANDOM_DELAY=0
START_HOURS_RANGE=22-23
#period in days delay in minutes job-identifier command
1 180 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 60 cron.monthly nice run-parts /etc/cron.monthly
各cronの最終実行日は以下の通り、実施日は20210126の21時30分に実施
→[anacron]は実行されるが、何もせず終了する。
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20210126
%%・/var/spool/anacron/cron.monthly:%%20210126
Jan 26 21:30:11 run-parts[1926]: (/etc/cron.hourly) starting 0anacron
Jan 26 21:30:11 anacron[1935]: Anacron started on 2021-01-26
Jan 26 21:30:11 anacron[1935]: Normal exit (0 jobs run)
Jan 26 21:30:11 run-parts[1926]: (/etc/cron.hourly) finished 0anacron
#### ケース8:START_HOURS_RANGE範囲内に実行する([anacrontab]を下記の通りにしてみた)
[cron.daily]の[period in days]を「2」にした。
RANDOM_DELAY=0
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
2 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
各cronの最終実行日は以下の通り、実施日は20210126の20時台
→[anacron]は実行されるが、何もせず終了する。
%%・/var/spool/anacron/cron.daily:%%20210125
%%・/var/spool/anacron/cron.weekly:%%20210126
%%・/var/spool/anacron/cron.monthly:%%20210126
Jan 26 20:18:40 run-parts[2728]: (/etc/cron.hourly) starting 0anacron
Jan 26 20:18:40 run-parts[2728]: (/etc/cron.hourly) finished 0anacron
Jan 26 20:18:40 anacron[2737]: Anacron started on 2021-01-26
Jan 26 20:18:40 anacron[2737]: Normal exit (0 jobs run)
### 気づいたこと
[delay in minutes]は1440(1日)までのようで、1441を入れると「Job `cron.XXXX' terminated」となり、%%/var/spool/anacron/cron.XXXX%%だけが更新された。
{{tag>AWS RHEL 実践的}}