あるお客様のサーバで httpd のログローテーションに失敗していました 😥
logrotate が access_log を olddir/access_log.1 に move してくれる
のですが、httpd が olddir/access_log.1 にログを書き込み続けてしまう
現象です。
本来は新しく作成された access_log にログを書きこんで欲しいのです。
調べたところ、同じ httpd に対する logrotate の設定ファイルが 3 つありました。
/etc/logrotate.d/httpd /etc/logrotate.d/httpd1 /etc/logrotate.d/httpd2 |
それぞれ postrotate で SIGHUP を httpd に送っているのですが、
httpd1, httpd2 の SIGHUP を httpd が受信していないのが原因っぽいです。
多分 3 つのローテーションが一瞬で行われるので、一瞬の間に
3 回 SIGHUP が httpd に対して送られます。
しかし、httpd は立て続けにシグナルを受信できないようで、
最初の SIGHUP を受信後、httpd1, httpd2 の
SIGHUP は無視されているっぽいです。
実際に以下のようにやって httpd のログを見てみると最初の
シグナルしか受信していないのがわかります。
kill -HUP httpd_pid; kill -HUP httpd_pid; kill -HUP httpd_pid |
そして、間に sleep 1 をいれて試してみたところ 3 回シグナルを受信しました。
そんな訳で、postrotate に sleep 1 を入れて様子見中です。。。