Логи два месяца не ротируются, хотя logrotate -f работает: пропал запуск по расписанию и как восстановить недостающие файлы пакета

Что было. На сервере с Ubuntu 16.04 syslog и mail.log растут месяцами; ручной logrotate -f /etc/logrotate.conf отрабатывает нормально. Значит, конфигурация в порядке, а не работает запуск по расписанию.

Причина. В /etc/cron.daily/ не оказалось скрипта logrotate: его когда-то удалили или он потерялся при неаккуратной чистке. Участник посоветовал переустановить пакет с восстановлением отсутствующих конфигурационных файлов:

sudo apt-get install --reinstall -o Dpkg::Options::=--force-confmiss logrotate

Обычный --reinstall пропущенные конфиги не возвращает (dpkg считает удалённый администратором конфиг осознанным решением); ключ --force-confmiss заставляет вернуть их. Ротация возобновилась; подтверждено.

Как это устроено на современных системах. На Ubuntu 18.04+ logrotate запускается не из cron, а таймером systemd: logrotate.timer → logrotate.service раз в сутки. Проверка:

systemctl status logrotate.timer          # active (waiting), следующий запуск
systemctl list-timers logrotate*
journalctl -u logrotate.service -n 20     # результат последнего запуска и ошибки

Если таймер отключён или замаскирован, systemctl enable --now logrotate.timer. Файл /etc/cron.daily/logrotate в таких системах может присутствовать, но проверяет, не запущен ли systemd, и ничего не делает.

Порядок диагностики «не ротируется».

  1. Запуск по расписанию есть? (таймер или cron, см. выше; на старых системах grep -r logrotate /etc/cron*).
  2. Запуск проходит без ошибок? logrotate -d /etc/logrotate.conf (отладочный прогон всех конфигов) покажет первую ошибку, из-за которой пропускается блок (права каталога, дубликат пути в двух конфигах, синтаксис).
  3. Файл уже ротировали недавно? /var/lib/logrotate/status хранит даты; при weekly следующая ротация только через неделю после записи, даже если файл огромный. Для ротации по размеру использовать maxsize, а не только период.
  4. Приложение продолжает писать в старый файл после ротации? Нужен postrotate с сигналом приложению или copytruncate.

Общее правило восстановления файлов пакета. dpkg -V logrotate покажет отсутствующие или изменённые файлы пакета; --force-confmiss вернёт конфиги, --reinstall вернёт бинарники. Для системных скриптов, удалённых по ошибке, это быстрее, чем искать их копии.

Утилита описана в документации Ubuntu.