anacronの理解を深めるため動作仕様を確認してみた。
まずは、anacronが実行されるまでの流れを図にしています。
ファイル/ディレクトリ構造はOS構築直後の初期状態としています。
最終的なフローは下記の通り、なぜこうなったか?の部分は/etc/anacrontabの動作仕様確認に書いてあります。
2021/01/27フローに誤りがあったので修正
# Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly
#!/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
・/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
[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
各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
各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)
各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
各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
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
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
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
#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
[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
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
[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
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だけが更新された。