Linux N/AСредняя

Ошибка logrotate в Linux: причины и способы исправить

Статья объясняет, что вызывает ошибки в утилите logrotate, и предоставляет проверенные способы их устранения — от проверки прав до конфигурации. Вы научитесь диагностировать и навсегда решить проблемы с ротацией логов.

Обновлено 8 апреля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 11+CentOS 8/Rocky 8+logrotate 3.11+

Что означает ошибка logrotate

Ошибка logrotate — это сбой в работе стандартной утилиты Linux для ротации (архивации и очистки) лог-файлов. Она обычно проявляется одним из следующих способов:

  • Логи не ротируются по расписанию (например, ежедневно или еженедельно).
  • В системном журнале (/var/log/syslog или /var/log/messages) появляются записи вида:
    error: error opening /var/log/nginx/access.log: Permission denied
    error: logrotate failed to rotate /var/log/syslog: No such file or directory
    
  • Ротация происходит, но создаётся некорректный архив (пустой или с нулевым размером).
  • Утилита logrotate завершается с ненулевым кодом возврата при ручном запуске.

Ошибка не критична для работы системы, но может привести к переполнению диска или потере исторических данных логов.

Причины возникновения

  1. Недостаточные права доступа. Процесс logrotate (запускаемый от root через cron) не может прочитать исходный лог-файл или записать сжатый архив из-за неверных прав (chmod) или владельца (chown) файла/каталога.
  2. Ошибки в конфигурации. Синтаксическая ошибка в файле /etc/logrotate.conf или в одном из файлов в /etc/logrotate.d/. Например, пропущена закрывающая фигурная скобка } или указан несуществующий путь.
  3. Конфликт с другим процессом. Другой демон (например, syslog-ng или rsyslog) удерживает дескриптор лог-файла в момент попытки его ротации, что вызывает ошибку переименования.
  4. Отсутствие лог-файла. В конфигурации указан путь к логу, который был удалён или никогда не создавался, а опция missingok не указана.
  5. Проблемы с cron. Задание для регулярного запуска logrotate отсутствует или не работает (например, из-за проблем в /etc/crontab или файлах в /etc/cron.*).

Способ 1: Диагностика через тестовый запуск

Это основной и самый информативный способ. Он покажет, что планировалось сделать, без реальных изменений.

  1. Выполните команду тестового прогона:
    sudo logrotate -d /etc/logrotate.conf
    
    Флаг -d включает режим отладки.
  2. Внимательно изучите вывод. Ищите строки со словами error, ignoring или reading. Они укажут на конкретный файл конфигурации и причину.
  3. Пример проблемного вывода:
    reading config file /etc/logrotate.d/nginx
    reading config file /etc/logrotate.d/nginx
    error: error opening /var/log/nginx/access.log: Permission denied
    ignoring /var/log/nginx/access.log because of error
    
    Здесь ясно видно, что проблема с правами на файл /var/log/nginx/access.log.

Способ 2: Проверка и исправление прав доступа

Если диагностика указала на Permission denied:

  1. Проверьте владельца и права на проблемный лог-файл и его родительский каталог:
    ls -l /var/log/nginx/
    
    Обычно лог-файлы должны принадлежать пользователю, который их пишет (например, www-data для nginx), а группе adm или syslog, чтобы root (от которого работает logrotate) имел доступ.
  2. Исправьте права, если нужно. Например, для лога nginx:
    sudo chown www-data:adm /var/log/nginx/access.log
    sudo chmod 640 /var/log/nginx/access.log
    
    Важно: Не меняйте права на файлы, которые активно пишутся сервисами, без понимания последствий. Лучше всего, если группа adm (или syslog) имеет на них права на чтение.
  3. Проверьте права на каталог /var/log/nginx/. logrotate должен иметь право на запись в него для создания архивов:
    sudo chmod 755 /var/log/nginx/
    

Способ 3: Проверка конфигурационных файлов

Если тестовый запуск не выявил ошибок Permission denied, но ротация не происходит:

  1. Проверьте синтаксис основного файла конфигурации:
    sudo logrotate -d /etc/logrotate.conf 2>&1 | grep -i "error\|syntax"
    
    Или просто запустите тестовый прогон и найдите error.
  2. Проверьте файлы в /etc/logrotate.d/. Убедитесь, что:
    • Каждый блок правил (для одного сервиса) заканчивается пустой строкой. Это обязательное требование синтаксиса.
    • Пути к лог-файлам указаны корректно и существуют.
    • Используются правильные директивы (daily, rotate 7, compress и т.д.).
  3. Пример корректного файла в /etc/logrotate.d/nginx:
    /var/log/nginx/*.log {
        daily
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        create 640 www-data adm
        sharedscripts
        postrotate
                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
        endscript
    }
    
    Обратите внимание на пустую строку после }.

Способ 4: Устранение конфликта с процессом

Если лог-файл используется другим процессом (часто rsyslog), его ротация может завершиться ошибкой device or resource busy. Решения:

  1. Используйте опцию copytruncate. В конфигурации для проблемного лога добавьте эту директиву. Она копирует файл и сразу обнуляет исходный, не требуя перезапуска сервиса. Минус — возможна потеря записей, сделанных во время копирования.
    /var/log/ваш_лог.log {
        ...
        copytruncate
    }
    
  2. Используйте скрипт postrotate. Это предпочтительный способ. В скрипте после ротации отправляйте сигнал демону логгера, чтобы он переоткрыл файл. Пример для rsyslog (как в конфиге nginx выше) или systemd-journald:
    postrotate
        journalctl --rotate
    endscript
    

Способ 5: Принудительный запуск и проверка cron

Если конфигурация верна, но ротация по расписанию не происходит:

  1. Запустите вручную с принудительной ротацией:
    sudo logrotate -vf /etc/logrotate.conf
    
    Флаг -v (verbose) покажет все действия. Флаг -f (force) игнорирует условие "ещё не прошло время для ротации".
  2. Проверьте, что cron запускает logrotate:
    • Задание обычно находится в /etc/cron.daily/logrotate (симлинк на /usr/sbin/logrotate).
    • Убедитесь, что файл исполняем: ls -l /etc/cron.daily/logrotate.
    • Проверьте, работают ли другие задания cron.daily. Можно посмотреть время последнего изменения файлов в /var/log/ — они должны обновляться ежедневно.

Профилактика

Чтобы избежать проблем с logrotate в будущем:

  1. Всегда используйте тестовый запуск (logrotate -d) после внесения изменений в конфигурацию.
  2. Соблюдайте синтаксис: пустая строка после каждого блока в /etc/logrotate.d/.
  3. Правильно настраивайте права. Убедитесь, что группа adm (или syslog) имеет доступ на чтение ко всем лог-файлам, которые ротируются.
  4. Для сервисов, пишущих в собственные файлы, в конфиге logrotate используйте copytruncate или корректный postrotate-скрипт с отправкой сигнала (например, kill -USR1).
  5. Регулярно мониторьте место на диске (df -h) и размер логов (du -sh /var/log/*), чтобы убедиться, что ротация происходит эффективно.

Часто задаваемые вопросы

Почему logrotate не ротирует логи, хотя конфиги правильные?
Как протестировать конфигурацию logrotate без переротации?
Что делать, если при ротации возникает 'error: error opening /var/log/syslog: Permission denied'?
Можно ли вручную запустить ротацию для конкретного лога?

Полезное

Проверьте журнал выполнения logrotate
Запустите диагностический прогон
Проверьте права на лог-файлы и каталоги
Проверьте синтаксис конфигурационных файлов
Принудительно выполните ротацию