◆ CentOS 7 (Fedora 25 も) は cron から anacron 経由で /etc/cron.daily/logrotate を実行
◆ Fedora 30 は systemd から実行
  ◆ Fedora のどのバージョンで変わったかは知らない
◆ CentOS は anacron の設定のせいで 3 時台に実行されてたけど systemd の方は 0 時台に実行される

以前この記事を書いたときは CentOS 7 の設定をみてました
少し前の Fedora 25 もあってそっちを見ても同じ感じでした
ですが最新の Fedora 30 でみてみると logrotate コマンドが呼び出されるまでの流れが変わっていました
26 ~ 30 のどこで変わったかはわかっていません

logrotate のバージョンは
CentOS 7 は 3.8.6
Fedora 25 は 3.10.0
Fedora 30 は 3.15.0
でした

CentOS 7 の方法

cron を使っていて

/etc/cron.daily/logrotate



/usr/sbin/logrotate /etc/logrotate.conf

を実行するスクリプトが設定されています
Fedora 25 のものでは -s オプションで /var/lib/logrotate/logrotate.state が指定されていました

Fedora 30

Fedora 30 では cron.daily には logrotate のスクリプトはありません
探してみると systemd に logrotate.service ユニットファイルがありました
cron からの呼び出しじゃなくて デーモンになったのかと思ったのですがそうでもありませんでした

ユニットファイルはこうなっています

[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
# details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
# no ProtectHome for userdir logs
# no PrivateNetwork for mail deliviery
# no ProtectKernelTunables for working SELinux with systemd older than 235
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true

注目するのはここ

Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

デーモン化するわけではなく 一回実行するだけです
実行するコマンドのほうは特に変わってないようです

実行タイミングはどうやって指定するのか探すと logrotate.timer というファイルが systemd フォルダの中にありました
これで実行時刻を指定してそうです

中身を見てみると

[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

onCalendar で毎日と設定してます
毎日何時なのか気になったので調べてみたら daily などは 0 時や 1 日と最初の時刻になるようです
https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.time.7.en

    minutely → *-*-* *:*:00
hourly → *-*-* *:00:00
daily → *-*-* 00:00:00
monthly → *-*-01 00:00:00
weekly → Mon *-*-* 00:00:00
yearly → *-01-01 00:00:00
quarterly → *-01,04,07,10-01 00:00:00
semiannually → *-01,07-01 00:00:00

また AccuracySec が 1h なのでチェック間隔が 1 時間ごとのようです
なので日が変わった直後ではなく 0 時から 1 時の間のどこかで実行されるようです

cron (anacron) のときはランダムディレイがありましたが Timer の設定ではありません
一応 RandomizedDelaySec というものはあるのですが設定されてないです
しかし AccuracySec の説明にホスト固有のランダムな位置に配置して CPU の消費電力の最適化がどうこう書いてるのでたぶん適度に分散されてるのだと思います

CentOS 7 の実行時刻

Fedora 30 の方は毎日 0 時~ 1 時ですが CentOS 7 のほうはもう少し遅めです

/etc/cron.daily/logrotate

が実行されるまでの流れを見てみると

まず /etc/cron.d/0hourly に /etc/cron.hourly のスクリプトを実行する設定があります

01 * * * * root run-parts /etc/cron.hourly

毎時間 1 分 (0 時 1 分, 1 時 1 分, 2 時 1 分, ...) に /etc/cron.hourly フォルダのスクリプトが実行されています
そのフォルダ内の /etc/cron.hourly/0anacron というスクリプトで anacron を実行しています

/usr/sbin/anacron -s

anacron の設定 (anacrontab) を見てみると ここで cron.daily や cron.weekly のスクリプトを実行しています

# /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-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

ここで /etc/cron.daily フォルダのスクリプトが実行されて logrotate されるわけですが START_HOURS_RANGE が 3-22 に設定されています
この時間中のみジョブを実行するらしく 0 時や 1 時には anacron コマンドが実行されてもスクリプトは実行されません
3-22 時の間のランダムというわけでもなく 3 時に実行可能なら 3 時に実行されます
12 時とか 20 時とかに実行されるのは PC の電源を落としていてその頃に電源を入れたなど anacron が実行されてなかった場合みたいです
電源を入れたのが 23 時 30 分とかだと 3 時すぎるまで次の実行はされないわけです
どうして 3-22 時なのかはわかりませんでした

また RANDOM_DELAY に 45 が指定されていて daily の delay には 5 が指定されているので最大 50 分ランダムで遅延します
なので ローテートされるのは基本は 3 時台になります
実際にローテートされたファイルを見ても更新時刻は 3 時台でした

そろそろ CentOS 8 が出そうですが 最近の Fedora に合わされるとローテート時刻が変わりそうですね