Приручаем логи

1. Способ через logrotate (рекомендуется)

logrotate — стандартный инструмент для ротации и удаления логов. Он безопаснее прямого удаления, так как учитывает работающие службы и сжимает старые логи.

1.1 Создаем конфиг для /var/log/

Создайте файл /etc/logrotate.d/varlog-clean с таким содержимым:

/var/log/*.log /var/log/*/*.log {
    daily              # проверяем логи ежедневно
    rotate 3           # храним 3 копии (т.е. логи за 3 дня)
    missingok          # не ругаться, если файлов нет
    notifempty         # не ротировать пустые файлы
    compress           # сжимать старые логи (gzip)
    delaycompress      # сжимать не сразу, а со следующей ротацией
    sharedscripts      # скрипты выполняются один раз для всей группы
    postrotate
        # Перезагрузка syslog (если используется)
        systemctl restart rsyslog.service >/dev/null 2>&1 || true
    endscript
}

1.2 Проверяем работу logrotate

Запустите вручную (для теста):

logrotate -vf /etc/logrotate.d/varlog-clean

Флаг -v — verbose, -f — принудительный запуск.

1.3 Добавляем в cron (если logrotate не настроен на daily)

По умолчанию logrotate запускается ежедневно через cron (/etc/cron.daily/logrotate), но если это отключено, добавьте в crontab:

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/varlog-clean

(запуск каждый день в 00:00)

2. Способ через cron и rm (простое удаление)

Если нужно просто удалять файлы раз в 3 дня без архивации:

2.1 Создаем скрипт для очистки

Создайте файл /usr/local/bin/clean-varlog.sh:

#!/bin/bash
# Удаляем файлы старше 3 дней в /var/log/
find /var/log/ -type f -name "*.log" -mtime +2 -exec rm -f {} \;
# Очищаем системные журналы (если нужно)
journalctl --vacuum-time=3d

Даём права на выполнение:

chmod +x /usr/local/bin/clean-varlog.sh

2.2 Добавляем задание в cron

Откройте crontab:

crontab -e

Добавьте строку (запуск каждые 3 дня в 00:00):

0 0 */3 * * /usr/local/bin/clean-varlog.sh

3. Важные замечания

Не удаляйте /var/log/ полностью! Некоторые файлы (например, wtmp, btmp, lastlog) критичны для системы.

Проверьте, какие логи можно удалять:

ls -lh /var/log/

Для journald (бинарные логи) используйте:

journalctl --vacuum-time=3d  # удалить записи старше 3 дней
Если используется syslog/rsyslog, убедитесь, что он не записывает логи в удаляемые файлы.

Вывод

  • Лучший вариант — logrotate (гибко, безопасно, с архивацией).

  • Простой вариант — cron + find + rm (но риск потерять важные логи).

Чтобы удалить все файлы в /var/log/ (или в любом другом каталоге), которые занимают более 100 МБ, можно использовать команду find с фильтрацией по размеру. Вот несколько способов:

1. Простое удаление файлов >100 МБ в /var/log/

find /var/log/ -type f -size +100M -exec rm -fv {} \;

Разбор команды:

  • find /var/log/ — ищем в /var/log/ (можно заменить на другой путь).
  • -type f — только файлы (не директории).
  • -size +100M — файлы больше 100 МБ.
  • -exec rm -fv {} \; — удаляем каждый найденный файл (-f — без подтверждения, -v — вывод списка удалённых).

Пример вывода:

removed '/var/log/syslog.1'
removed '/var/log/kern.log.2.gz'

2. Просмотр списка файлов перед удалением (без rm)

Если нужно сначала проверить, какие файлы будут удалены:

find /var/log/ -type f -size +100M -ls
или

find /var/log/ -type f -size +100M -exec du -h {} \;

Выведет список файлов >100 МБ с их размерами.

3. Удаление с подтверждением (интерактивно)

Если хотите подтверждать удаление каждого файла:

find /var/log/ -type f -size +100M -exec rm -i {} \;

Система будет спрашивать:

rm: remove regular file '/var/log/syslog.1'? y

4. Удаление + логирование в файл

Чтобы сохранить список удалённых файлов:

find /var/log/ -type f -size +100M -exec rm -fv {} \; > /var/log/large_files_cleanup.log

5. Добавление в cron для автоматического удаления

Если нужно выполнять очистку регулярно (например, раз в неделю):

Создаём скрипт /usr/local/bin/clean_large_logs.sh:

#!/bin/bash
find /var/log/ -type f -size +100M -exec rm -fv {} \; >> /var/log/large_files_cleanup.log

Даём права:

chmod +x /usr/local/bin/clean_large_logs.sh

Добавляем в crontab -e (например, каждое воскресенье в 3:00):

0 3 * * 0 /usr/local/bin/clean_large_logs.sh

Важные предупреждения

Не удаляйте файлы вручную из /var/log/ без проверки — некоторые логи могут быть нужны для работы системы (auth.log, secure, journal/).

Проверьте, какие процессы пишут в большие файлы (может быть ошибка в настройках):

lsof +L1 | grep deleted  # показать "висячие" большие файлы

Лучше настроить logrotate, чтобы логи автоматически ротировались и сжимались (см. предыдущий ответ).

Вывод

  • Для разового удаления → find /var/log/ -type f -size +100M -exec rm -fv {} \;

  • Для автоматизации → добавьте скрипт в cron.

  • Для безопасного управления логами → настройте logrotate.