前島と申します。こんばんは。

山田さんのメールを読んでnewsyslogの動作に興味を持ちました。
そこで、FreeBSD 6.1-RELEASEのnewsyslogのソースを持ってきて、
デバッグオプションを付けてmakeした物を使って動作を調べて
みました。

# cd /usr/src/usr.sbin/newsyslog
# make COPTS="-g -O0"
# gdb ./newsyslog

テスト用のログファイルを生成し、/etc/newsyslog.confのwhen条件、
size条件を調整してnewsyslogを何度か実行してみたところ、この
newsyslogは次のように動作しました。

1. when条件が不成立のときはsize条件が判定されることなく、
   ローテートがスキップされました。
       newsyslog.cのdo_entry()において、491行から530行までの
       ifブロックでwhen条件が評価されています。ここでwhen条件が
       不成立の場合には即座にreturnし、size条件の評価(547行)は
       実行されませんでした。

2. またwhen条件が成立したときには、size条件の成立、不成立に
   かかわらずローテートが行われました。
       size条件が成立する場合は547行のif条件が成立することに
       より、またsize条件が成立しない場合でも551行のif条件が
       成立することにより、いずれの場合にもローテート実行
       フラグがセットされました(ent->rotate = 1)。

つまり、newsyslogは「size条件またはwhen条件のいずれかが成立
した時にローテートを実行する」ようには出来ていないのだと思い
ます。

メールによる返信