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