Logrotate が /tmp で動作しない

Logrotate が /tmp で動作しない

Debian 10 サーバーで logrotate に関する奇妙な問題が発生しています。

全体として、logrotate (v3.20.1) は正常に動作し、ローテーションも正常に行われています... ただし、毎日「skrink」したい /tmp 内のいくつかのファイルを除きます。 これらのログは collectd からの cvs ファイルであり、24 時間以上保持する必要はありません。

私の collectd 設定ファイルは次のとおりです:

/var/log/collectd/collectd.log {
        weekly
        rotate 4
        create
        compress
        missingok
}

/tmp/collectd/csv/localhost/*/* {
        daily
        rotate 0
        copytruncate
        missingok
}

以下は logrotate ログ ファイルの一部です。

rotating pattern: /var/log/collectd/collectd.log  weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/collectd/collectd.log
  Now: 2022-12-09 00:00
  Last rotated at 2022-12-04 15:15
  log does not need rotating (log has been rotated at 2022-12-04 15:15, which is less than a week ago)

rotating pattern: /tmp/collectd/csv/localhost/*/*  after 1 days (no old logs will be kept)
empty log files are rotated
considering log /tmp/collectd/csv/localhost/*/*

私が気づいた奇妙なことは、logrotate ステータス ファイル /var/lib/logrotate/status で、他のエントリとは異なり、これらのファイルのステータス日付が 2022-12-1-0:0:0 のままになっていることです。

# cat /var/lib/logrotate/status | sort
logrotate state -- version 2
"/tmp/collectd/csv/localhost/*/*" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-idle" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-interrupt" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-nice" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-softirq" 2022-12-1-0:0:0
...
"/tmp/collectd/csv/localhost/tcpconns-4772-remote/tcp_connections-SYN_SENT" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/tcpconns-4772-remote/tcp_connections-TIME_WAIT" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/uptime/uptime" 2022-12-1-0:0:0
...
"/var/log/borgbackup.log" 2022-12-4-15:15:18
"/var/log/btmp" 2022-12-1-0:0:1
"/var/log/chrony/*.log" 2022-1-13-18:0:0
"/var/log/clamav/clamav.log" 2022-12-4-15:15:18
"/var/log/clamav/freshclam.log" 2022-12-4-15:15:18
"/var/log/collectd/collectd.log" 2022-12-4-15:15:18

デバッグモードで logrotate を実行してみましたが、結果は次のようになりました:

...
rotating pattern: /tmp/collectd/csv/localhost/*/*  after 1 days (no old logs will be kept)
empty log files are rotated
considering log /tmp/collectd/csv/localhost/cpu-0/cpu-idle
  Now: 2022-12-09 17:32
  Last rotated at 2022-12-01 00:00
  log needs rotating
...
rotating log /tmp/collectd/csv/localhost/cpu-0/cpu-idle, log->rotateCount is 0
dateext suffix '-20221209'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /tmp/collectd/csv/localhost/cpu-0/cpu-idle.1.bz2 to /tmp/collectd/csv/localhost/cpu-0/cpu-idle.2.bz2 (rotatecount 1, logstart 1, i 1),
renaming /tmp/collectd/csv/localhost/cpu-0/cpu-idle.0.bz2 to /tmp/collectd/csv/localhost/cpu-0/cpu-idle.1.bz2 (rotatecount 1, logstart 1, i 0),
log /tmp/collectd/csv/localhost/cpu-0/cpu-idle.2.bz2 doesn't exist -- won't try to dispose of it
skip copying /tmp/collectd/csv/localhost/cpu-0/cpu-idle to /tmp/collectd/csv/localhost/cpu-0/cpu-idle.1
truncating /tmp/collectd/csv/localhost/cpu-0/cpu-idle
compressing log with: /bin/lbzip2
...

しかし、ファイルは毎日真夜中にローテーションされず、大きくなり続けます :(

/tmp 内のファイルをローテーションすることは可能ですか? 可能のようですが、何が問題なのでしょうか?

ご協力いただきありがとうございます。

答え1

設定を確認し、オプションが に設定されている/lib/systemd/system/logrotate.serviceことを確認する 必要があります。PrivateTmpfalse

忘れてはいけないsystemctl daemon-reload

Logrotate は Cron ではなく Systemd タイマーによって処理されることを自分で発見しました。今年の大発見です!

答え2

以下は、logrotate サービス用の systemd conf ファイルです。

# cat logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate -v --log=/var/log/logrotate/logrotate.log /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
#  details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
#  no ProtectHome for userdir logs
#  no PrivateNetwork for mail deliviery
#  no ProtectKernelTunables for working SELinux with systemd older than 235
#  no MemoryDenyWriteExecute for gzip on i686
PrivateDevices=true
PrivateTmp=false
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true

関連情報