SSブログ

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 へのリンク


[備考]


nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。