症状
CentOS Linux release 7.5.1804 (Core)
/var/log/httpd/access_log が30MBも貯まっている事に気がついた。
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 ~]# vi /etc/cron.d/0hourly
45 5 * * * * root run-parts /etc/cron.hourly
[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
原因
[1] 0hourlyの時間の書き方が間違っている。*印が1つ多い。
[2] 0hourlyとanacrontabの時間が食い違っている。
①が05時45分に実行されるが、③で06時~08時と指定されているので、③で停まっており④のlogrotateまで辿りつけていなかった。
修正
/etc/cron.d/0hourlyでcron.hourlyが毎時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時だったらという曖昧条件で行う。