~~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 実践的}}