三歩あるけば物も忘れる

お腹のお肉がメタボックル

ユーザ用ツール

サイト用ツール


InfrastructureConstruction:RHEL8:OperationSpecificationSurvey-anacron

92.anacron動作仕様調査

anacronの理解を深めるため動作仕様を確認してみた。

図にして仕組みを理解しよう

まずは、anacronが実行されるまでの流れを図にしています。
ファイル/ディレクトリ構造はOS構築直後の初期状態としています。

最終的なフローは下記の通り、なぜこうなったか?の部分は/etc/anacrontabの動作仕様確認に書いてあります。
2021/01/27フローに誤りがあったので修正

①毎時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は[STARTHOURSRANGE]の範囲に入るが、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分に実施
→[RANDOMDELAY]+[delay in minutes]で、[STARTHOURS_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」にして[STARTHOURSRANGE]の範囲を超えさせた。

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だけが更新された。

コメント

コメントを入力:
V V P X U
 
InfrastructureConstruction/RHEL8/OperationSpecificationSurvey-anacron.txt · 最終更新: 2021/01/01 by 127.0.0.1