Debian 10のlogrotateの不具合 [Debian]
logrotate 3.14.0-4
systemd 241-7~deb10u4
clamdscan 0.102.2+dfsg-0+deb10u1
1. 発生事象
clamd のログファイルの切替が有効とならないことがある。
・該当するファイルは、/var/log/clamav/clamav.log である。
・logrotate でのファイルのローテーションは実行されている。
(cf. /var/lib/logrotate/status)
・clamd でのログの出力先が切り替っていない。
ログファイル内のログのタイムスタンプから判断できる。
・Debian 9 (logrotate 3.11.0-0.1) では発生しない。
2. 原因
ブート直後に logrotate が実行されることがあるためである。
(1) logrotate.timer により、ブート直後に logrotate が実行されることがある。
・00:00 に logrotate.timer を実行できない場合、次のブート時に発生する。
・logrotate.timer の設定に依存する。
([Timer] 欄の 'Persistent=true' により発生する。)
(2) ブート直後には、当該サービスは下記のような状態と思われる。
・常駐プロセスが起動されており、既にログファイルをオープンしている。
(常駐プロセスがログファイルを掴んでいる。)
・サービスとしては起動の途中であり、まだ inactive 状態である。
(3) 当該サービスについて、logrotate は下記のような処理を実施する。
・設定されている条件に従い、ログファイルをローテーションする。
・サービスが active 状態の場合、SIGHUP の送信を行う。
(cf. /etc/logrotate.d/clamav-daemon)
(4) 上記の場合、常駐プロセスでのログファイルの再オープンは実施されない。
・常駐プロセスでの SIGHUP の受信がないためである。
・このため、古いログファイルへの出力が継続される。
(補足)
・当該サービスは clamav-daemon、常駐プロセスは clamd である
・ブート直後以外での logrotate の実行では、問題は発生しない。
(当該サービスが active 状態のため。)
・Debian 9 では、logrotate.timer は存在しない。
(anacron は、cron から実行される。)
3. 対処方法
下記の手順により、ブート直後の logrotate の実行を回避する。
(1) /lib/systemd/system/logrotate.timer を変更する場合
(a) /lib/systemd/system/logrotate.timer の編集
# diff logrotate.timer logrotate.timer.org 6d5 < OnBootSec=5min 8a8 > Persistent=true
・[Timer] 欄の 'Persistent=true' の削除
ブート直後に logrotate が実行されないようにする。
・[Timer] 欄への 'OnBootSec=5min' の追加
ブートの 5分後に logrotate を実行する。
(サービスが active なるまでの待ち時間を設けている。)
・anacron の delay に該当する設定項目はない。
(b) 変更内容の反映
# systemctl daemon-reload
(2) /etc/systemd/system/logrotate.timer を作成する場合
(a) /etc/systemd/system/logrotate.timer の作成
/lib/systemd/system/logrotate.timer をコピーする。
(b) /etc/systemd/system/logrotate.timer の編集
/lib/systemd/system/logrotate.timer の場合と同じ。
(c) 変更内容の反映
# systemctl daemon-reload # systemctl enable logrotate.timer
(補足)
/etc/systemd/system/timers.target.wants/logrotate.timer が存在する。
ファイルの内容は、下記のいずれかである。
・/lib/systemd/system/logrotate.timer へのリンク
・/etc/systemd/system/logrotate.timer へのリンク