cron.dailyでLogrotateが実行されない、0hourlyとanacrontabとの時間の食い違い

cron.dailyでLogrotateが実行されない、0hourlyとanacrontabとの時間の食い違い

症状

環境 : CentOS Linux release 7.5.1804 (Core)
/var/log/httpd/access_log はlogrotateの設定で1024KB以上でローテートする様に設定していたはずだが、31MBも貯まっている事に気がついた。
cron.dailyが実行されていない事により、logrotateも実行されないので各ログファイルが肥大化していた。

確認の設定を確認

以下に記載する設定内容を確認しやすいように表を作りました。

/etc/logrotate.d/httpdの確認

/etc/logrotate.d/httpd で毎日チェックし容量が1MB以上あったらローテートし、過去ログは30世代まで残す設定になっている。
ログローテートのテストを行っても

[root@sv01 ~]# logrotate -d /etc/logrotate.d/httpd
省略
log needs rotating

と容量オーバーしてローテートが必要とでるが、実際にはローテートが実行されていない。
その他ログファイル、mysql,mail,messageなどもローテートされず、容量が肥大化していたので「logrotateコマンド自体が叩かれていないのでは?」と思う。

cronまわりの確認

以前に、収容しているウェブサービスの関係上、デフォルト設定の時間にログローテートやウイルス定義の更新などのcronが実行されてCPUを圧迫するのを避けるために、時間設定を変更したのを思い出す。

[root@sv01 ~]# logrotate -d /etc/[root@sv01 ~]# vi /etc/cron.d/0hourly
45 5 * * * * root run-parts /etc/cron.hourly
[root@sv01 ~]# logrotate -d /etc/[root@sv01 ~]# vi /etc/anacrontab
START_HOURS_RANGE=6-8

調べてみると
/etc/cron.daily/logrotateが実行されるまでのフローは

確認内容のまとめ

① /etc/cron.d/0hourly

# 05時45分に実行する
45 5 * * * * root run-parts /etc/cron.hourly

② /etc/anacrontab

省略
# 時間指定なし
/usr/sbin/anacron -s

③ /etc/cron.hourly/0anacron

# 06時~08時のだったら実行する
START_HOURS_RANGE=6-8
# cron.dailyは1日毎で遅延は5分
1       5       cron.daily              nice run-parts /etc/cron.daily

④ /etc/cron.daily/logrotate

# 時間指定なし
# logrotate実行
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

Logrotateされない原因

  • 0hourlyの時間の書き方が間違っている。*印が1つ多い。
  • 0hourlyとanacrontabの時間が食い違っている。
    ①が05時45分に実行されるが、③で06時~08時と指定されているので、③で停まっており④のlogrotateまで辿りつけていなかった。

修正点

/etc/cron.d/0hourlyでcron.hourlyが毎時01分に実行するように修正

[root@sv01 ~]# vi /etc/cron.d/0hourly
# 毎時01分に実行するように修正
01 * * * * root run-parts /etc/cron.hourly`

こうすれば結果的にlogrotateは毎日06時~08時に実行されるようになる。

logrotateを05時45分ジャストに実行する場合は

  • cron.dailyの実行時間指定を0anacronで管理せずに、crontabで時間指定する。
  • /etc/cron.daily/logrotateを移動させ、crontabで時間指定する。

などの方法も考えられる。
今回は05時45分以降ならいつでもいいので、/etc/cron.hourly/0anacron のSTART_HOURS_RANGEで06時~08時だったらという曖昧条件で行う。