症状
環境 : 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時だったらという曖昧条件で行う。
コメント